本篇讲述Linux中的文件操作指令,和Linux文件系统的知识。这部分内容会很多也很杂,但如果想学习或想Linux操作进阶建议还是仔细阅读一下。我写起来也很累的QwQ(虽然我写文档也是为了巩固)

Linux的文件结构

​ Linux的基本哲学:一切皆文件。

Linux将几乎所有类型的资源都抽象成了文件或文件类型。这使得Linux的访问方式统一数据处理灵活、以及统一化的权限控制

​ 同时在Linux中没有盘的概念,所有文件的起始位置都是根目录,如果一颗倒置的树。

  • 文件和目录被组织成一个单根倒置树结构

  • 文件系统从根目录下开始,用“/”表示 \

  • 根文件系统(rootfs):root filesystem

  • 标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL

  • 以 . 开头的文件为隐藏文件

  • 路径分隔的 /

  • 文件名最长255个字节

  • 包括路径在内文件名称最长4095个字节

  • 蓝色–>目录 绿色–>可执行文件 红色–>压缩文件 浅蓝色–>链接文件 灰色–>其他文件

  • 除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用

  • 每个文件都有两类相关数据:元数据:metadata,即属性, 数据:data,即文件内容

Linux 常见的目录

/etc  服务的配置文件
/boot  系统启动的文件
/root  超管的家目录
/home/xxx 普通用户的家目录
/dev  设备文件 磁盘  光驱 
/tmp  临时目录
/proc 进程相关的文件信息
/mnt  临时挂载点

Linux 文件类型

1
2
3
4
5
6
7
8
9
10
一共有七种,分别是:
- 普通文件
d 目录文件 directory
p 管道文件 pipe
s 套接字 socket
c 字符设备
l 链接文件 link
b 块设备 block

如果想在Linux系统中查看文件的类型,可以通过ls -l 或ll指令查看

- 普通文件

​ Linux中数量最多的一种文件类型,包括 纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);以及各种压缩文件

d 目录文件

​ 字面意思,就是目录,和Windows的文件夹一样。能使用cd命令进入。

p 管道文件

​ 管道文件时一种特殊的文件类型,也叫FIFO(命名管道)。它的主要目的是实现进程间通信(IPC),允许不相关的进程通过文件系统进行数据交换。FIFO是first-in-first-out(先进先出)的缩写,指的是数据的处理顺序。

​ 与匿名管道不同,FIFO是一种命名管道,它在文件系统中有一个可见的节点(虽然不存储实际数据)。多个程序可以通过打开/读写这个特殊文件来通信,避免了直接操作同一普通文件可能导致的冲突问题。

s 套接字文件

​ 这类文件是用于网络数据连接。当启动一个服务来监听客户端的请求时,客户端就可以通过套接字来进行数据通信。最常出现的位置在/var/run目录中

c 字符设备

​ 字符设备文件:即串行端口的接口设备,例如键盘、鼠标等等

l 链接文件

​ 类似Windows的快捷方式,可以直接通过其跳转到目标目录位置或运行/读取目标文件

b 块设备

​ 块设备文件就是存储数据供系统存取的接口设备。是硬盘的文件映射。

好了,这里开始就是涉及到具体的命令操作了,建议自己装一台虚拟机顺手进行试试

1 查看文件类型

​ ls -l <目录> 查看目录下所有文件的详细信息。其中第一排就是文件类型

2 文件操作命令

​ 了解如何想Windows一样创建,移动,修改,删除文件

2.1 显示当前工作目录 pwd

​ 每个shell和系统进程都会有一个当前的工作目录(即CWD:current work directory)

​ 显示当前shell CWD的绝对路径即指令**pwd**

​ pwd指令的含义是printing working directory

1
2
3
pwd有两个参数:
-P 显示真实物理路径(用于软链接的文件夹,使用后将显示软链接对象的路径)
-L 显示链接路径(默认 显示当前路径,包括软链接。但只会显示软连接定义的名字)

2.2 绝对和相对路径

  • 绝对路径

​ 以正斜杠/(根目录开始)

​ 完整的文件路径

​ 可以一路沿伸到任何一个文件名

  • 相对路径

​ 以.或..开始

​ 一般情况是以当前工作目录往后沿伸(真一路..一级级父目录招商去为什么不用绝对路径)

​ 可以方便快速的找到目标文件/文件夹

1
2
3
两个关于路径的指令:
basename: 从参数中获取文件名而不要路径(如果全是路径则取最后一个文件夹名)
dirname: 从参数中获取路径而不要文件名

2.3 更改目录 cd

指令cd:change directory 改变工作目录(当前命令行所在目录)

选项: -P 进入软链接目录时根据软链接的指向跳转至物理路径,而不是在软链接的虚拟路径

参数:可以使用绝对或相对路径

1
2
3
4
5
6
#切换至父目录
cd ..
#切换至当前用户家目录
cdcd ~
#切换至切换前的工作目录
cd -

2.4 列出目录内容 ls

指令ls:list 列出当前目录的内容或指定目录

常见选项:

1
2
3
4
5
6
7
8
9
10
11
12
-a	让隐藏文件一并显示
-l 显示额外信息(一般Linux系统会封装别名ll,使用它其实就是ls -l)
-R 递归显示,往下全部展示(有文件夹就会打开文件夹往下查找)
-ld 目录和符号链接信息(d即显示当前所在的这个文件夹的信息,而不是查找文件夹内有啥)
-1 文件分行显示(即一行只显示一个文件名)
-S 按从大到小排序(根据占用的内存大小)
-t 按mtime排序(mtime,即文件内容最后改变的时间)
-u 配合-t选项,可以显示按atime从新到旧的排序(atime即文件最后的访问时间,单独使用不改变显示顺序。需配合-t或-l才能体现效果)
-U 按目录存放顺序显示
-X 按文件后缀排序
-F 对不同类型文件显示时附加不同的符号
-C 文件多时,以多列的方式显示文件(默认标准输出是一列)

说明:

1
2
ls	查看不同后缀文件时的颜色由	/etc/DIR_COLORS 和 @LS_COLORS变量定义
ls -l 看到文件的大小,不一定是实际文件真正占用空间的大小

2.5 查看文件状态 stat

​ 文件相关信息:metadata(元数据)、data(文件的内容数据)

​ 每个文件都有三个时间戳:

access time 访问时间,简称atime读取文件内容时更新

modify time 修改时间,简称mtime修改文件内容时更新(如写入、追加、删除内容)

change time 改变时间,简称ctime元数据或内容变化时更新(如权限、所有者、硬链接数、内容修改等)

1
2
3
4
5
6
拓展:
元数据是文件系统中用于描述文件属性的数据,通常包括:
----基础信息:文件大小、inode号、硬链接数、设备ID等。
----权限信息:所有者、所属组、读写执行权限
----时间戳:atime、mtime、ctime
----扩展属性:如SELinux标签、ACL规则等(这个我也不认识,ds说的)

2.6 确定文件内容 file

​ 文件可以包含多种类型的数据,可以使用file命令检查文件的类型,确定该使用什么方式打开或使用

1
2
3
4
5
6
7
8
9
#  file [选项] <文件名>
选项:
# -b 列出文件识别结果时,不显示文件名称
# -f filelist 列出文件列表中文件名的文件类型
# -F 使用指定分隔符号替换输出文件名后默认的":"分隔符
# -L 查看对应软链接对应文件的文件类型
# --help 显示命令在线帮助

例如查看文件是否是ASCII格式的,如果是需要转成UTF-8的形式

2.7 文件通配符模式

​ 文件通配符模式:wildcard pattern。用于匹配符合条件的多个文件,方便批量管理文件

​ 通配符使用特定的符号(这被称为元字符)表示特定的匹配规则。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 常见的通配符:
* 匹配零个或多个字符,但不会匹配隐藏文件,即"."开头的文件
? 匹配任何单个字符,一个汉字也算一个字符
~ 当前用户家目录
~test 用户test的家目录
. 和 ~+ 当前的工作目录
~- 上一个工作目录
[0-9] 匹配属于0-9范围内的一个数字
[a-z] 匹配任意一个大小写字母
[A-Z] 匹配除了小写a以外的任意一个大小写字母
[test] 匹配't','e','s'中的任意一个字母
[^test] 匹配除了't','e','s'的任意一个字符
[^a-z] 匹配除了字母以外的任意一个字符

# 上面内容为centos7测试后的结果。问AI可能会有不一样,建议自己动手试试
1
2
3
# 系统设定好的字符类


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 终端测试的输出

[root@centos7 ~]#ls
1 anaconda-ks.cfg content.txt false fstab.bak lines.txt los.txt mixed.txt right system.log
[root@centos7 ~]#touch a A b B c C
[root@centos7 ~]#ls [a-z]
a A b B c C
[root@centos7 ~]#ls [A-Z]
A b B c C
[root@centos7 ~]#ls [^a-z]
1
[root@centos7 ~]#ls [:lower:]
ls: 无法访问[:lower:]: 没有那个文件或目录
[root@centos7 ~]#ls [:lower:]:
ls: 无法访问[:lower:]:: 没有那个文件或目录
[root@centos7 ~]#ls [:lower:]:
ls: 无法访问[:lower:]:: 没有那个文件或目录
[root@centos7 ~]#ls [:upper:]
ls: 无法访问[:upper:]: 没有那个文件或目录

# ls好像不能用这个?不懂

​ 所以通配符应该是模糊的匹配,使用过程中并没有说的那么精确。精确严格的匹配可能更需要的是正则表达式?

2.8 创建空文件和刷新时间 touch

​ 命令touch可用于创建空文件或刷新文件的时间

1
2
3
4
5
6
#	touch [选项] <文件名>
选项:
-a 仅改变atime和ctime [访问时间和状态变更时间(元数据)]
-m 仅改变mtime和ctime [修改时间(内容)和状态变更时间(元数据)]
-t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的时间戳 (例:202308151830.30)
-c 如果文件不存在,不创建新文件(不会有报错)

​ 这个指令很简单,可以理解成windows的右键创建新文件。但windows会带后缀,Linux不会,完全空白

2.9 复制文件和目录 cp

​ 利用命令cp可以实现文件或目录的复制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#	cp [选项] <目标文件> <目标路径>		cp:copy的缩写
选项:
-i 如果目标已存在,覆盖前询问是否覆盖
-n 如果重复,不覆盖,直接跳过(优先级高于i)
-v 显示详细操作过程
-f 强制覆盖(会忽略-i的提示)

-r/-R 递归复制目录及其内容
-a 归档模式,等效(-dR --preserve=all),保留所有属性
-d 保留软链接(不会跟随链接拷贝原文件)

-p 保留权限、所有者、时间戳等属性
--preserve=[attr] 自定义保留属性(如:mode,ownership,timestamps)

-b 覆盖前备份(默认备份文件名为filename~)
--backup=numbered 增量备份(生成filename.~1~,filename.~2~等)
-u 仅复制更新的文件(增量更新)

​ 这个指令参数很多,但不要害怕,大部分时间用到的参数都很少。

——复制文件可以在目标路径上加上文件名,这样也能做到重命名

——同理,复制文件夹也一样

2.10 移动和重命名文件 mv

​ 命令mv:实现文件或目录的移动和更名

注:

​ 在同一分区移动数据时,速度快:原因是数据存储位置并未发生改变。至改变了对应的路径

​ 在不同分区移动数据时,速度相对慢:原因是数据位置发生变化,从一个分区转移到了另一分区

1
2
3
4
5
6
#	mv [选项] <目标文件> <目标路径>
选项:
-i 交互式提示(覆盖前会要求确认)
-f 强制覆盖,无提示
-b 如有同名目标存在,覆盖前先生成备份,备份名为(filename~)
-v 显示详细操作过程(一般不用,终端跳转一堆内容没任何意义)

​ 如同windows中的剪切和重命名一般,mv也是这些作用。很简单,但实用。

2.11 批量修改文件名 rename

​ 命令rename:批量修改文件名

1
2
#	rename [选项]	<旧字符串> <新字符串> <文件名通配符>
rename '.bak' '' *.bak # 将当前路径下所有以.bak结尾的文件的.bak替换成空(删除后缀)

​ 命令prename

1
2
3
#	在其他一些系统上可能会使用这个第三方的库命令,也可以进行替换操作
# 在ubuntu上好像名字不同,叫rename
# prename 's/旧字符串/新字符串' 文件名通配符

2.12 删除文件 rm

​ 命令rm:删除文件

​ 此命令非常危险,谨慎使用。

注:建议先使用mv将需要删除的文件移动到临时目录再删除或先做好备份再删除

1
2
3
4
5
6
7
8
#	rm [选项] <文件路径>
选项
-i 交互式,每次删除前需要确认
-f 直接删除,忽略不存在的文件和警告
-r/-R 递归删除,给个路径下如果有文件或文件夹都会一并清除
-v 显示详细操作过程
--no-preserve-root 允许删除根目录(工作中你敢干就等着吧)
--preserve-root 默认保护根目录,防止误删

​ 同时rm删除文件,如果文件正在被使用还没解除占用,则会进入等待。等待占用释放后就会立刻删除。(执行后就无法挽回了)

​ 命令shred:删除文件并对文件所在区域进行覆写,杜绝文件恢复的可能

1
2
3
4
5
6
7
8
#	shred [选项] <文件路径>
选项
-z 在最后一次覆盖使用零填充,隐藏覆盖痕迹(默认使用随机数据)
-v 显示详细操作过程,输出覆盖进度和当前操作状态
-u 覆盖完成后将文件大小变为0并彻底删除文件
-n 需要给一个整数。指定覆盖文件的次数。默认:3次
-f 强制操作,忽略文件权限检查(需有足够权限)
--random-source= 指定随机数据源(默认使用系统的随机设备)

​ 命令unlink:删除指定的文件(不能用于目录)

1
2
3
#	unlink <文件路径>

是Linux封装的底层命令,用于删除单个文件(它没有选项,也不能使用通配符进行匹配)

​ 命令rmdir:删除空目录

1
2
3
4
#	rmdir [选项] <文件夹路径>
选项
-p 递归删除父空目录
-v 显示详细信息

注:目录里面就算有一个空文件夹此时也是非空的状态,无法直接删除的

2.13 显示目录树 tree

​ 命令tree:用于显示较为详尽的路径之间的关联信息,方便查看

1
2
3
4
5
6
7
8
9
#	tree [选项] <路径>
选项
-d 只显示目录
-L 只显示到规定的层级(需要携带一个整数)
-P 只显示匹配通配符模式的文件
-a 显示隐藏文件
-f 显示完整路径(默认显示相对路径)
-h 显示文件大小(并转换成KB/MB等单位)
-o 将结果输出到文件(需在选项后面跟文件)

2.14 创建目录 mkdir

​ 命令mkdir:用于创建目录

1
2
3
4
5
#	mkdir [选项] <路径>
选项
-p 递归创建路径中所有不存在的目录
-v 显示创建时的详细信息
-m 创建目录时直接指定权限

2.15 删除空目录 rmdir

​ 命令rmdir:用于删除空目录

1
2
3
4
5
6
#	rmdir [选项] <路径>
选项
-p 递归删除空目录
-v 显示详细信息

#rmdir只能删除空目录,有文件的非空目录无法删除。递归只能删除叠在一起的一堆空目录