1 文件系统目录结构

03 文件管理和IO重定向_IO重定向

1.1 文件系统目录结构

  • 文件系统的目录结构成树形结构
  • 一切文件的路径起点都是从根目录开始,用 / 表示
  • 文件名大小写敏感
  • 以 . 开头的文件都是隐藏文件
  • 路径通过 / 进行分割
  • 不同颜色的文件,它的类型是不同的
  • 每个文件都有两类数据:元数据和数据,元数据存放的是文件的属性信息,数据存放的是文件里的内容

1.2 常见的文件系统目录功能

/boot							#存放系统启动时的引导文件,其中Linux中最重要的内核文件存放于此
/bin							#存放所有用户的基本命令,是/usr/bin的软链接
/usr/bin					#同/bin
/sbin							#存放管理类的基本命令,是/usr/sbin的软链接
/usr/sbin					#同/sbin
/lib							#启动程序时所依赖的基本库文件
/usr/lib					#同/lib
/lib64						#存放基于x86_64系统架构的程序所依赖的库文件
/home/USERNAME		#普通用户的家目录
/root							#系统管理员root的家目录
/etc							#常用配置文件存放的目录
/tmp							#临时文件存放目录
/mnt							#临时文件系统挂载目录
/var							#存放内容经常发生变化的文件目录
/sys							#存放系统硬件设备信息相关文件的虚拟目录
/proc							#与内核和进程信息相关的目录
/dev							#存放字符和硬件设备文件相关的目录
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

1.3 文件类型

通过下面命令查看文件类型,其中列出的信息中第一个字符表示文件类型。

ls -l 或 ll
  • 1.

Linux系统中的七种文件类型:

文件类型

标识符

说明

普通文件

-

file

目录文件

d

directory

符号链接文件

l

link

字符设备文件

c

character

块设备文件

b

block

管道文件

p

pipe

套接字文件

s

socket

范例:

ll -d /etc/passwd /etc /bin /dev/zero /dev/sda /run/systemd/notify /run/initctl
  • 1.

03 文件管理和IO重定向_Linux管道_02

2 文件操作命令

2.1 绝对路径和相对路径

绝对路径:

  • 以根 / 开始的都是绝对路径
  • 描述的是一个文件存放的完整位置
  • 任何时候都可以通过绝对路径找到文件

相对路径:

  • 不以 / 开始的都是相对路径
  • 描述的是文件以某个目录位置为参考的路径
  • 可以快速找到文件所在位置

相关命令:(写脚本可能会用到)

basename
作用:取文件的基名

dirname
作用:取文件的路径
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

范例:

03 文件管理和IO重定向_Linux管道_03

2.2 显示当前工作目录

pwd
常用选项:
	-L	#显示链接路径
	-P	#显示物理路径
  • 1.
  • 2.
  • 3.
  • 4.

范例:

03 文件管理和IO重定向_Linux基础_04

2.3 更改目录

命令说明:

cd
作用:更改工作目录

常见用法:
cd ..			#回到上级目录
cd -			#回到上一次工作目录
cd ~ 			#回到当前用户家目录
cd				#回到当前用户家目录,等于 cd ~

相关环境变量:
$PWD				#当前工作目录
$OLDPWD			#上一次工作目录
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

2.4 列出目录内容

命令说明:

命令一:tree
作用:以树形方式显示目录的内容结构
常用选项:-d	#只关注文件本身的信息,对于目录文件就不会进入到里面看内容了

命令二:ls
作用:列出目录中的内容

常用选项:
	-a	#列出目录中的所有内容,包括隐藏文件
	-l	#列出详细信息,ll 等于 ls -l
	-h	#以人类可读的将文件大小进行单位换算
	-d	#只关注文件本身的信息,对于目录文件就不会进入到里面看内容了
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

范例:

03 文件管理和IO重定向_Linux基础_05

注意:ls -l 看到的文件大小不一定是文件实际占用的大小

2.5 查看文件状态

命令说明:

stat
作用:显示文件的状态信息,比 ls -l 输出的信息更详细
说明:
Access Time:表示文件访问时间,通过cat等能看到文件内容的命令都会改变访问时间
Modify Time:表示文件修改时间,通过vim等将文件内容进行编辑的命令都会改变修改时间
Change Time:表示文件元数据(属性信息)更改时间,通过chmod等将文件元数据信息改变的命令都会改变该时间
Birth:			表示文件创建时间
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

范例:

03 文件管理和IO重定向_Linux管道_06

2.6 确定文件内容

命令说明:

命令一:file
作用:用于判断文件类型,还可以用于判断文件的编码方式

命令二:dos2unix
作用:将windows的文件格式转换为Linux的文件格式
说明:windows的换行是 “\r\n”,Linux的换行是“\n”,区别就是Linux少了一个\r

命令三:unix2dos
作用:将Linux的文件格式转换为windows的文件格式

命令四:hexdump
作用:以ASCII编码的十六进制格式查看文件内容
常用选项:
	-C	#输出规范的十六进制格式
  -s	#指定偏移量位置开始输出
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

范例一:判断文件类型

03 文件管理和IO重定向_Linux基础_07

范例二:Linux的文件格式与windows的文件格式

  • 首先判断文件类型,并以ASCII编码的十六进制格式查看文件内容的区别

03 文件管理和IO重定向_Linux管道_08

  • 将Linux格式的文件转换为windows格式的文件

03 文件管理和IO重定向_IO重定向_09

  • 将windows格式的文件转换为Linux格式的文件

03 文件管理和IO重定向_Linux管道_10

2.7 创建空文件

命令说明:

touch
作用:创建空文件或刷新文件时间
常见选项:
	-a	#改变atime
  -m	#改变mtime
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

范例:

03 文件管理和IO重定向_Linux基础_11

2.8 创建空目录

命令说明:

touch
作用:创建空文件
常见选项:
	-p	#递归创建
  • 1.
  • 2.
  • 3.
  • 4.

范例:

03 文件管理和IO重定向_Linux管道_12

2.9 文件通配符

文件通配符是用来匹配文件名的,与后面要学到的正则表达式有区别,正则表达式是用来匹配字符串的,也就是筛选数据信息。某些通配符与正则表达式的符号相同,功能也相同,但不是全部。与之相比正则表达式更为强大。

常见的文件通配符:

*#匹配零个或多个字符,但不匹配"."开头的文件
?						#匹配任何一个字符
[0-9]				#匹配数字0-9中的任何一个数字
[a-z]				#匹配所有小写字母
[A-Z]				#匹配所有大写字母
[yang]			#匹配yang中的任何一个字符
[^yang]			#匹配除了yang中的任何一个字符
[^a-d]			#匹配除了a-d中的任何一个字符
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

Linux中预定义的通配符:

[:digit:]		#匹配任意数字,相当于[0-9]
[:lower:]		#匹配任意小写字母,相当于[a-z]
[:upper:]		#匹配任意大写字母,相当于[A-Z]
[:alpha:]		#匹配任意大小写字母,相当于[a-zA-Z]
[:alnum:]		#匹配任意大小写字母和数字,相当于[0-9a-zA-Z]
[:blank:]		#匹配水平空白字符
[:space:]		#匹配水平或垂直空白字符(一般都用这个匹配所有空白字符)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

范例:

环境准备:[root@Rocky9 dir]#touch {a..z}.txt
[root@Rocky9 dir]#touch {A..Z}.txt
[root@Rocky9 dir]#touch {0..9}.txt
[root@Rocky9 dir]#ls
0.txt  5.txt  a.txt  C.txt  f.txt  H.txt  k.txt  M.txt  p.txt  R.txt  u.txt  W.txt  z.txt
1.txt  6.txt  A.txt  d.txt  F.txt  i.txt  K.txt  n.txt  P.txt  s.txt  U.txt  x.txt  Z.txt
2.txt  7.txt  b.txt  D.txt  g.txt  I.txt  l.txt  N.txt  q.txt  S.txt  v.txt  X.txt
3.txt  8.txt  B.txt  e.txt  G.txt  j.txt  L.txt  o.txt  Q.txt  t.txt  V.txt  y.txt
4.txt  9.txt  c.txt  E.txt  h.txt  J.txt  m.txt  O.txt  r.txt  T.txt  w.txt  Y.txt

[root@Rocky9 dir]#ls [0-9]*
0.txt  1.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt
[root@Rocky9 dir]#ls [a-f]*
a.txt  b.txt  c.txt  d.txt  e.txt  f.txt
[root@Rocky9 dir]#ls [^A-Z]*
0.txt  3.txt  6.txt  9.txt  c.txt  f.txt  i.txt  l.txt  o.txt  r.txt  u.txt  x.txt
1.txt  4.txt  7.txt  a.txt  d.txt  g.txt  j.txt  m.txt  p.txt  s.txt  v.txt  y.txt
2.txt  5.txt  8.txt  b.txt  e.txt  h.txt  k.txt  n.txt  q.txt  t.txt  w.txt  z.txt
[root@Rocky9 dir]#ls [yang].txt
a.txt  g.txt  n.txt  y.txt
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

2.10 复制文件

命令说明:

cp
作用:复制文件,文件备份场景中频繁使用
常用选项:
	-i	#若目标存在,则提示是否覆盖
  -R	#递归复制,用于复制目录
  -a	#复制后的文件保留源文件所有属性
  -v	#显示复制过程
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

范例:

03 文件管理和IO重定向_IO重定向_13

2.11 移动文件或重命名

命令说明:

命令一:mv
作用:移动文件或改名
说明:若源文件与目标在同一目录下则改名,反之移动文件

命令二:rename
作用:批量实现文件的重命名
rocky的命令格式:rename "匹配文件名中的字符" "替换的字符" 需要重命名的文件
ubuntu的命令格式:
	rename "s/匹配文件名中的字符/替换的字符/" 需要重命名的文件
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

范例:移动或重命名文件

03 文件管理和IO重定向_Linux基础_14

范例:批量重命名

03 文件管理和IO重定向_Linux管道_15

2.12 删除文件

命令说明:

rm
作用:删除文件

常用选项:
	-r	#递归删除
  -f	#强制删除
  -i	#删除前确认
  --no-perserve-root	#强制删除根目录
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

范例:

03 文件管理和IO重定向_Linux管道_16

3 文件元数据和节点表结构

3.1 inode表结构

在Linux中,一切皆文件:

  • 每个文件分为两部分:元数据部分和具体内容数据部分
  • 文件的元数据和具体内容数据在磁盘分区上是分开存放的
  • 存储文件元数据的区域叫inode,中文译作“索引节点”
  • 每个文件都有一个inode和n(n>=1)个block数据块,inode存储文件元数据,数据块存储文件具体内容数据

我们所说的inode存放的元数据,所谓元数据就例如:

  • inode编号
  • 文件类型
  • 权限
  • 属主属组
  • 链接数
  • 文件大小
  • 文件的各种时间戳
  • 指向具体block数据库的指针
  • 等等

以上概念引入到磁盘中:

  • 磁盘在格式化时,系统自动将磁盘分为两个区域
  • 一个是inode区,用来存放文件的inode
  • 一个是数据区,分成很多个block(块),用来存放文件具体内容数据
  • 一个磁盘分区上有多少个inode和多少个block,由系统决定,跟文件系统,磁盘分区大小,数据块大小有关
  • inode编号可重复使用,当删除一个文件后,其inode编号会被回收,以供下次新文件使用

目录是特殊文件

  • 目录文件的内容保存了此目录中文件的列表以及inode编号的对应关系
  • 文件引用的是inode号
  • 目录是目录下的文件名和文件inode号之间的映射

查看磁盘分区利用率:

df 
作用:查看分区利用率
常用选项:
	-i	#可以查看分区的inode资源情况
	-h	#以人类可读的单位换算分区使用了多少空间
  -T	#查看分区使用的文件系统
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

范例:

03 文件管理和IO重定向_Linux基础_17

3.2 软硬链接

3.2.1 硬链接

硬链接的要点:

硬链接本质上同源文件是一个文件,只不过是同一个文件有多个名字的表现形式
硬链接的文件类型和源文件的文件类型相同
硬链接只能对文件进行创建不能对目录进行创建
用相对路径创建硬链接时源文件的相对路径是相对于当前工作目录路径
每创建一个文件的硬链接,它的硬链接数就会加一,反之减一,痛过ls -l 可以查看文件的硬链接数
删除源文件,不会影响硬链接文件
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

创建硬链接的命令:

ln 源文件 硬链接文件
  • 1.

范例:

03 文件管理和IO重定向_Linux基础_18

3.2.2 软链接

软链接的要点:

软链接文件相当于windows的快捷方式
删除源文件会影响软链接文件
软链接文件与源文件的类型毫无关系,软链接文件本身只是链接文件,通过ls -l看到的文件类型的符号是小写的L即 l
软链接可以对目录进行创建,应用场景:软件的升级迭代与软件回滚
软链接文件的大小等于链接路径的字符个数
创建软链接时源文件的相对路径是相对于链接文件的目录路径
注意:软硬链接的创建都建议使用绝对路径,不容易出错
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

创建软链接的命令:

ln -s 源文件 软链接文件
  • 1.

范例:

03 文件管理和IO重定向_IO重定向_19

3.2.3 软硬链接的区别总结

区别

硬链接

软链接

本质

与源文件是同一个文件

与源文件不是同一个文件

跨设备

不支持

支持

inode号

相同

不同

链接数

每创建一个硬链接,链接数加一,反之

创建或删除,链接数不变

文件夹

不支持

支持

文件类型

与源文件类型相同

链接文件

删除源文件

不影响硬链接文件的访问

影响软链接文件的访问

文件大小

与源文件大小相等

等于链接路径的字符长度

相对路径

源文件的相对路径是相对于当前工作目录路径

源文件的相对路径是相对于链接文件的目录路径

3.3 生产案例

3.3.1 inode资源用完

案例:如下图提示空间满 No space left on device,但 df 可以看到空间还有很多,为什么,怎么解决?

03 文件管理和IO重定向_Linux基础_20

案例环境准备:

03 文件管理和IO重定向_IO重定向_21

案例分析:

在Linux的磁盘分区中,每个分区的inode资源都是有限的,每创建一个文件都会消耗掉一个inode,所以当该分区inode资源被使用完后,在创建文件就会
提示:No space left on device
  • 1.
  • 2.

解决办法:

由于每删除一个文件,该文件的inode就会被回收,方便后续的新文件继续使用该inode,所以可以将该分区下的所有无用的文件都删除,释放inode。
  • 1.
3.3.2 大文件的正确删除方式

案例:如下图提示空间已满或快满了,使用rm命令删除很大的无用文件后,df 命令仍然看到空间不足,为什么如何解决?

03 文件管理和IO重定向_IO重定向_22

案例环境准备:

df -h /boot
dd if=/dev/zero of=/boot/test bs=1024M
vim /boot/zero

重新打开一个新的终端
df -h
ls -l /boot
rm -f /boot/test
df -h /boot
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

范例分析:

如果在删除大文件之前,有其他用户正在操作该文件(比如vim或tail -f等),那么rm该大文件空间仍然不会被释放,正确的删除方式应该是cat /dev/zero > BIGFILE;rm -f BIGFILE
或者
> BIGFILE;rm -f BIGFILE
  • 1.
  • 2.
  • 3.
  • 4.

解决办法:

首先删除的大文件被其他用户使用的进程lsof | grep delete
然后杀掉该进程
kill -9
  • 1.
  • 2.
  • 3.
  • 4.

4 IO重定向和管道

4.1 标准输入和输出

Linux系统中有三个最基本的IO设备

  • 标准输入设备(stdin):对应终端键盘,对应的设备文件是/dev/stdin -> /proc/self/fd/0
  • 标准正确输出设备(stdout):对应终端显示器,对应的设备文件是/dev/stdout -> /proc/self/fd/1
  • 标准错误输出设备(stdout):对应终端显示器,对应的设备文件是/dev/stderr -> /proc/self/fd/2

范例:查看标准输入和输出设备信息

ls -l /dev/std*
  • 1.

03 文件管理和IO重定向_Linux管道_23

4.2 IO重定向

4.2.1 标准正确输出和标准错误输出重定向

相关符号:

覆盖操作符:使用如下操作符会将文件原本的内容覆盖> 	#将标准正确输出重定向到文件
1> 	#将标准正确输出重定向到文件
2>	#将标准错误输出重定向到文件
&>	#将标准正确输出和标准错误输出都重定向到文件
>&	#将标准正确输出和标准错误输出都重定向到文件

追加操作符:使用如下操作符,文件内容不变,在文件内容最后一行的下一行追加内容
>> 	#将标准正确输出追加到文件
1>> #将标准正确输出追加到文件
2>>	#将标准错误输出追加到文件
&>>	#将标准正确输出和标准错误输出都追加到文件
>>&	#将标准正确输出和标准错误输出都追加到文件
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

范例:覆盖操作符(重定向)

03 文件管理和IO重定向_IO重定向_24

范例:追加操作符

03 文件管理和IO重定向_Linux基础_25

范例:将标准正确输出和标准错误输出重定向到不同文件中

03 文件管理和IO重定向_IO重定向_26

4.2.2 标准输入重定向

相关符号:

<		#将文件的内容传递给命令或程序
  • 1.

说明:< 经常和一些支持标准输入的命令使用,例如cat,cat命令的本身支持标准输入,直接执行cat命令的效果就是你在键盘输入什么,cat程序就打印什么。

范例:

03 文件管理和IO重定向_IO重定向_27

相关命令:

tr
作用:替换字符串
格式一:
	tr 选项 匹配的字符 替换的字符 < 文件
格式二:
  某个命令 | tr 选项 匹配的字符 替换的字符
常用选项:
	-d	#删除匹配的字符
  -s	#压缩匹配的字符
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

范例:

03 文件管理和IO重定向_Linux基础_28

4.2.3 多行重定向

多行重定向一般用于在脚本中编辑多行配置文件

输入多行重定向的格式:

格式一:cat > FILE <<EOF
line1
line2
...
EOF

格式二:在脚本中常用,内容的缩进不受格式影响,结束的EOF标记不受tab键的影响
cat > FILE <<-EOF
line1
line2
...
EOF
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

范例:

03 文件管理和IO重定向_Linux管道_29

4.3 管道

管道同标准输入一样需要结合命令来使用,管道的含义就是将前一个命令的标准正确输出作为后一个命令的标准输入a。所有的命令都会在当前的shell进程的子进程中进行。

管道的符号:

|
格式:
CMD | CMD | CMD | ...
  • 1.
  • 2.
  • 3.

范例:

03 文件管理和IO重定向_IO重定向_30

相关命令:

tee
作用:配合管道可以实现将结果输出到屏幕的同时,还可以将结果输出到文件中
常用选项:
	-a	#追加到指定文件(默认是覆盖)
  • 1.
  • 2.
  • 3.
  • 4.

范例:

03 文件管理和IO重定向_Linux基础_31