03 Linux下文件管理和IO重定向
1、文件系统目录结构

- 每个文件都有两类相关数据:元数据:metadata,即属性;数据:data,即文件内容
1.1 常见的文件系统目录功能

1.2 应用程序的组成部分
不同类型的文件常用的目录
| 文件类型 | 常用目录 |
|---|---|
| 二进制文件 | /bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin |
| 库文件 | /lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64 |
| 配置文件 | /etc,/etc/DIRECTORY,/usr/local/etc |
| 帮助文件 | /usr/share/man,/usr/share/doc,/usr/local/share/man,/usr/local/share/doc |
1.3 Linux下文件类型
| 文件类型 | 标识符 | 说明 |
|---|---|---|
| 普通文件 | - | |
| 目录文件 | d | directory |
| 符号链接文件 | l | link |
| 块设备文件 | b | block |
| 字符设备文件 | c | character |
| 管道文件 | p | pipe |
| 套接字文件 | s | socket |

2、文件操作命令
2.1 显示当前工作目录
pwd#常用选项
-P #显示真实的物理路径
-L #显示链接路径(默认)
2.2 绝对路径和相对路径
-
绝对路径
- 以正斜杠/即根目录开始
- 描述完整的文件的位置路径
- 可用于任何想指定有一个文件名的时候
-
相对路径
- 不以斜线开始,而是以当前所在的位置开始
- 一般情况下,是指相对于当前工作目录的路径,特殊场景下啊,是相对于某目录的位置
- 可以作为一个简短的形式指定一个文件名
2.3 更改目录
cd#常用选项
-L #切换至链接目录,默认选项
-P #切换至真是目录,而非链接目录cd .. #切换至父目录
cd - #切换至上一个目录
cd | cd ~ #切换至当前用户家目录
cd ~username #切换至指定用户家目录
2.4 列出目录内容
ls#常用选项-a #包含隐藏文件
-l #显示额外的信息
-s #按从大到小排序
-X #按文件后缀排序
2.5 查看文件状态stat
stat filename | dirname
2.6 确定文件内容
filecat
2.7 文件通配符模式
常见的通配符如下:
* #匹配零个或多个字符,但不匹配“.”开头的文件,即隐藏文件
? #匹配任何单子字符,一个汉字也算一个字符
[0~9] #匹配数字范围
[a-z] #一个字母
[A-Z] #一个字母
[wang] #匹配列表中的任何的一个字符
[^wang] #匹配列表中所有字符以外的字符
[^a-z] #匹配列表中所有字符以外的字符
2.8 创建空文件和刷新时间
touch [OPTION]... FILE...
2.9 复制文件和目录
cp [OPTION]... [-T] SOURCE DEST#可以用来做备份的操作
cp -i --backup=numberd issue abc
2.10 移动和重命名文件
mv [OPTION]... [-T] SOURCE DEST#常用选项
-b #如果目标存在,则先备份
-n|--no-clobber #如果目标文件已存在,则跳过此文件移动
-i|--interactive #如果目标文件已存在,则提示是否覆盖
-u|--upgrade #当源文件比目标文件新时,才执行移动操作
-v|--verbose #显示移动过程
2.11 删除文件
rm [OPTION]... [FILE]...#常用选项-i #删除前确认
-f #不确认直接删除
-r #递归删除
-d #删除空目录
2.12 目录操作
2.12.1 显示目录树tree
tree#常用选项
-a #显示所有,包括隐藏目录和文件
-d #只显示目录
-f #显示所有内容的完整路径
-F #在执行文件,目录,Socket,符号链接,管道文件,各自加上“*”,“/”,“=”,“@”,“|”号
-p #显示内容权限
-s #显示内容大小
-o filename #将显示的内容输出到指定文件中
-L n #只显示n层目录
2.12.2 创建目录mkdir
mkdir [OPTION]... DIRECTORY...#常用选项
-m|--mode #目录权限属性
-p|--parents #如果要创建的目录父级目录不存在,则一起创建,是递归的意思
-v|--verbose #显示创建过程
2.12.3 删除空目录
rmdir [OPTION]... DIRECTORY...#常用选项
--ignore-fail-on-non-empty #忽略非空错误提示
-p|--prents #连着父目录一起删除
-v|--verbose #显示删除过程
3、文件元数据和节点表结构
3.1 inode表结构
在Linux系统中,一切皆文件,每个文件,又分为文件元数据和具体内容两部分。
每个文件都有一个inode和n(n>=1)个block数据块,inode存储文件元数据,数据块存储文件具体内容数据。
磁盘在格式化时,系统会自动将磁盘分为两个区域:
- 一个是inode区(inode table),用来存放文件的inode
- 一个是数据区,分成很多个block(块),用来存放文件的具体内容数据
一个磁盘分区上有多少个inode和多少个block,由系统自行决定,跟文件系统,磁盘分区大小,数据块大小有关
一个磁盘分区,能存放多沙鸥个文件,由文件大小,磁盘分区大小,inode数量决定
inode编号可重复使用,当删除一个文件之后,其inode编号会被回收,供下次新文件使用
每一个inode表记录对应的保存了一下信息:
- inode number(索引节点编号)
- 文件类型
- 权限
- 属主属组
- 链接数
- 文件大小
- 各时间戳
- 指向具体数据块的指针
- 有关文件的其他数据
以指针大小为4字节,block块大小为4KB为前置条件
指针大小和block块大小跟操作系统平台,以及文件系统有关
-
直接指针
- 12个直接指针,直接指向具体数据块,如果block大小为4096(4K),则直接指针可以保存48KB的文件
-
间接指针
- 1个间接指针,指向一个数据块,只不过该block上保存的是指针,而不是具体数据
- 如果block大小为4096(4K),一个指针占用4字节,所以此处可以存储4096/4=1024个block地址
- 同理,其指向的1024个block上,也都是存储的指针地址
- 则此处可以存储的数据大小为1024*4096=4MB
-
双重间接指针
- 1个双重间接指针,指向一个数据块,只不过该block上保存的是指针,而不是具体数据
- 如果block大小为4096(4K),一个指针占用4字节,所以此处可以存储4096/4=1024个block地址
- 同理,其指向的1024个block上,也都是存储的指针地址
- 则此处可以存储的数据大小为102410244096=4GB
-
三重间接指针
- 1个双重间接指针,指向一个数据块,只不过该block上保存的是指针,而不是具体数据
- 如果block大小为4096(4K),一个指针占用4字节,所以此处可以存储4096/4=1024个block地址
- 同理,其指向的1024个block上,也都是存储的指针地址
- 则此处可以存储的数据大小为102410241024*4096=4TB
-
单文件最大容量
- 12*直接指针+间接指针+双重间接指针+三重间接指针
目录
目录是个特殊文件,目录文件的内容保存了此目录中文件的列表及inode number对应关系
- 文件引用一个是inode号
- 人是通过文件名来引用一个文件
- 一个目录是目录下的文件名和文件inode号之间的映射
cp和inode
cp命令:
- 分配一个空闲的inode号,在inode表中生成新条目
- 在目录中创建一个目录项,将名称与inode编号关联
- 拷贝数据生成新的文件
rm和inode
rm命令:
- 链接数递减,从而释放的inode号可以被重用
- 把数据块放在空闲列表中
- 删除目录项
- 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
3.2 硬链接
硬链接的作用是允许一个文件拥有多个有效的路径名
新增一个文件,指向某个文件的inode,这样,这两个文件就互为硬链接,也就是多个文件名,都是指向同一个inode,这时硬链接的本质。
硬链接的特性:
- 创建硬链接会在对应的目录中增加额外的记录项以引用文件
- 对应于同一文件系统上一个物理文件
- 每个文件引用相同的inode号
- 创建时链接数递增
- 删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文件被删除
- 不能跨越驱动器或分区
- 不支持对目录创建硬链接
ln filename linkname
3.3 符号or软链接
软链接也称为符号链接,类似于windows中的快捷方式
软链接是建立一个独立的文件,这个文件的指向的是目标的文件名
软链接特点:
- 一个符号链接的内容是它引用文件的名称
- 可以对目录后创建软链接
- 可以跨分区的文件实现
- 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数
- 软链接如果使用相对路径,是相对于源文件的路径,而非相对于当前目录
- 删除软连接本身,不会删除源目录内容
- 删除源目录单文件,不会删除链接文件
ln -s filename linkname
3.4 硬链接和软链接区别总结
| 选项 | 硬链接 | 软链接 |
|---|---|---|
| 本质 | 本质是同一个文件 | 本质不是同一个文件 |
| 跨设备 | 不支持 | 支持 |
| inode | 相同 | 不同 |
| 链接数 | 创建新的硬链接,链接数会增加,删除硬链接,链接数减少 | 创建或删除,链接数不会变化 |
| 文件夹 | 不支持 | 支持 |
| 相对路径 | 原始文件相对路径是相对于当前工作目录 | 原始文件相对路径是相对于链接文件的相对路径 |
| 删除源文件 | 是链接数减一,但链接文件的访问不受影响 | 链接文件将无法访问 |
| 文件类型 | 和源文件相同 | 链接文件,和源文件无关 |
4、IO重定向和管道
4.1 标准输入和输出
Linux系统中有三个最基本的IO设备:
- 标准输入设备(stdin):对应终端键盘
- 标准输出设备(stdout):对应终端显示器
- 标准错误输出设备(stderr):对应终端的显示器
4.2 I/O重定向redirect
I/O重定向:将默认的输入,输出错误对应的设备改变,指向新的目标
4.2.1 标准输出和错误重新定向
STDOUT和STDERR默认是使用当前终端,但也可以重定向到指定终端或指定文件
4.2.2 标准输入重定向
4.2.2.1 标准输入重定向
bc <a.txt >rs.txt
#将a.txt的内容重定向到bc,由bc输出到rs.txt
4.2.2.2 标准输入多行重定向
cat <<EOF
> 123
> 456
> EOF
123
456
4.2.2.3 高级重定向写法
cat <<< "abc"
bc <<< "1+2+3"
4.3 管道
4.3.1 管道
前一个命令的输出作为后一个命令的输入,就像拿水管将两个命令连起来
格式
COMMOND1|COMMAND2|COMMAND3|……#最明显的管道命令类型
ls --help | grep "size"#多重管道命令
echo $PATH | tr a-z A-Z | tr -s ":" "\n"
4.3.2 tee命令
将标准输入复制到每个指定文件,并显示到标准输出
tee [OPTION]... [FILE]...#常用选项
-a #内容追加到给定的文件而非覆盖
-i #忽然中断信号
-p #对写入非管道的行为排查无错误,其使用的是warn-nopipe
--output-error #设置写入出错时的行为cmd1 |tee [-a ] filename | cmd2