三.Linux文件管理和IO重定向

一.文件系统及目录结构

1.文件系统的目录结构

文件和目录被组织成一个单根倒置树结构
文件系统从根目录下开始,用“/”表示
根文件系统(rootfs):root filesystem
标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL
以 . 开头的文件为隐藏文件
路径分隔的 /
文件名最长255个字节
包括路径在内文件名称最长4095个字节
蓝色-->目录 绿色-->可执行文件 红色-->压缩文件 浅蓝色-->链接文件 灰色-->其他文件
除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引
号来引用
每个文件都有两类相关数据:元数据:metadata,即属性, 数据:data,即文件内容

2.常见的文件系统目录功能

/boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放于此目录
/bin:所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
/sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
/lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
/lib64:专用于x86_64系统上的辅助共享库文件存放位置
/etc:配置文件目录
/home/USERNAME:普通用户家目录
/root:管理员的家目录
/media:便携式移动设备挂载点
/mnt:临时文件系统挂载点
/dev:设备文件及特殊文件存储位置
 b: block device,随机访问
 c: character device,线性访问
/opt:第三方应用程序的安装位置
/srv:系统上运行的服务用到的数据
/tmp:临时文件存储位置
/usr: universal shared, read-only data
 bin: 保证系统拥有完整功能而提供的应用程序
 sbin:
 lib:32位使用
 lib64:只存在64位系统
 include: C程序的头文件(header files)
 share:结构化独立的数据,例如doc, man等
 local:第三方应用程序的安装位置
/var: variable data files
 cache: 应用程序缓存数据目录
 lib: 应用程序状态信息数据
 local:专用于为/usr/local下的应用程序存储可变数据
 lock: 锁文件
 log: 日志目录及文件
 opt: 专用于为/opt下的应用程序存储可变数据
 run: 运行中的进程相关数据,通常用于存储进程pid文件
 spool: 应用程序数据池
 tmp: 保存系统两次重启之间产生的临时数据
/proc: 用于输出内核与进程信息相关的虚拟文件系统
/sys:用于输出当前系统上硬件设备相关信息虚拟文件系统
/selinux: security enhanced Linux,selinux相关的安全策略等信息的存储位置

3.应用程序的组成部分

二进制程序:/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/

4.CentOS7 之后目录结构变化

/bin 和 /usr/bin
/sbin 和 /usr/sbin
/lib 和/usr/lib
/lib64 和 /usr/lib64

5Linux下的文件类型

- 普通文件
d 目录文件directory
b 块设备block
c 字符设备character
l 符号链接文件link
p 管道文件pipe
s 套接字文件socket

二.文件操作命令

1 显示当前工作目录

pwd命令

-P 显示真实物理路径
-L 显示链接路径(默认)

2 绝对和相对路径

绝对路经

以正斜杠/ 即根目录开始
完整的文件的位置路径
可用于任何想指定一个文件名的时候

相对路径名

一般情况下,是指相对于当前工作目录的路径,特殊场景下,是相对于某目录的位置
可以作为一个简短的形式指定一个文件名

基名:basename,只取文件名而不要路径
目录名:dirname,只取路径,不要文件名

3 更改目录

命令 cd

可以使用绝对或相对路径

选项:-P 切换至物理路径,而非软链接目录

切换至父目录: cd ..
切换至当前用户主目录: cd
切换至以前的工作目录: cd -

相关的环境变量:

PWD:当前目录路径
OLDPWD:上一次目录路径

4 列出目录内容

ls 命令可以列出当前目录的内容或指定目录

ls [options] [files_or_dirs]

常见选项:

-a 包含隐藏文件
-l 显示额外的信息
-R 目录递归
-ld 目录和符号链接信息
-1 文件分行显示
-S 按从大到小排序
-t 按mtime排序
-u 配合-t选项,显示并按atime从新到旧排序
-U 按目录存放顺序显示
-X 按文件后缀排序
-F 对不同类型文件显示时附加不同的符号:*/=>@|
-C 文件多时,以多列的方式显示文件,默认是一列(标准输出)

注:

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

5 查看文件状态 stat

stat 命令:

stat filename

每个文件有三个时间戳:

access time 访问时间,atime,读取文件内容
modify time 修 改时间,mtime,改变文件内容(数据)
change time 改变时间,ctime,元数据发生改变

6 确定文件内容

文件可以包含多种类型的数据,使用file命令检查文件的类型,然后确定适当的打开命令或应用程序使

file [options] ...

常用选项:

-b 列出文件辨识结果时,不显示文件名称
-f filelist 列出文件filelist中文件名的文件类型
-F 使用指定分隔符号替换输出文件名后默认的”:”分隔符
-L 查看对应软链接对应文件的文件类型
--help 显示命令在线帮助

7 文件通配符模式 wildcard pattern

文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件
通配符采有特定的符号,表示特定的含义,此特符号称为元 meta 字符

常见的通配符如下:

*   匹配零个或多个字符,但不匹配 "." 开头的文件,即隐藏文件
?   匹配任何单个字符
~   当前用户家目录
~user   用户user家目录
~+和.     当前工作目录
~-     前一个工作目录
[0-9]   匹配数字范围
[a-z]   一个字母
[A-Z]   一个字母
[abcde]   匹配列表中的任何的一个字符
[^abcde]   匹配列表中的所有字符以外的字符
[^a-z]   匹配列表中的所有字符以外的字符

Linux系统中预定义的字符类:man 7 glob

[:digit:]:任意数字,相当于0-9
[:lower:]:任意小写字母,表示 a-z
[:upper:]: 任意大写字母,表示 A-Z
[:alpha:]: 任意大小写字母
[:alnum:]:任意数字或字母
[:blank:]:水平空白字符
[:space:]:水平或垂直空白字符
[:punct:]:标点符号
[:print:]:可打印字符
[:cntrl:]:控制(非打印)字符
[:graph:]:图形字符
[:xdigit:]:十六进制字符

8 创建空文件和刷新时间

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

touch [OPTION]... FILE...

选项:

-a 仅改变 atime和ctime
-m 仅改变 mtime和ctime
-t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的时间戳
-c 如果文件不存在,则不予创建

9 复制文件和目录

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

cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...

常用选项

-i 如果目标已存在,覆盖前提示是否覆盖
-n 不覆盖,注意两者顺序
-r, -R 递归复制目录及内部的所有内容
-a 归档,相当于-dR --preserv=all,常用于备份功能
-d --no-dereference --preserv=links 不复制原文件,只复制链接名
--preserv[=ATTR_LIST]
 mode: 权限
 ownership: 属主属组
 timestamp:
 links
 xattr
 context
 all
-p 等同--preserv=mode,ownership,timestamp
-v --verbose
-f --force
-u --update 只复制源比目标更新文件或目标不存在的文件
-b 目标存在,覆盖前先备份,默认形式为 filename~ ,只保留最近的一个备份
--backup=numbered 目标存在,覆盖前先备份加数字后缀,形式为 filename.# ,可以保留多
个版本

10 移动和重命名文件

mv 命令可以实现文件或目录的移动和改名
同一分区移动数据,速度很快:数据位置没有变化
不同分区移动数据,速度相对慢:数据位置发生了变化

mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...

常用选项:

-i 交互式
-f 强制
-b 目标存在,覆盖前先备份

利用 rename 可以批量修改文件名

rename [options] <expression> <replacement> <file>...

11 删除文件

使用 rm 命令可以删除文件

rm [OPTION]... FILE...

常用选项:

-i 交互式
-f 强制删除
-r 递归
--no-preserve-root 删除/

rm 虽然删除了文件,但是被删除的文件仍然可能被恢复,在安全要求较高的场景下,可以使用shred安
全删除文件

shred [OPTION]... FILE...

常见选项:

-z   最后一次覆盖添加0,以隐藏覆盖操作
-v 能够显示操作进度
-u 覆盖后截断并删除文件
-n # 指定覆盖文件内容的次数(默认值是3次)

12 目录操作

①显示目录树 tree

tree

选项:

-d: 只显示目录
-L level:指定显示的层级数目
-P pattern: 只显示由指定wild-card pattern匹配到的路径

②创建目录 mkdir

mkdir

选项:

-p: 存在于不报错,且可自动创建所需的各目录
-v: 显示详细信息
-m MODE: 创建目录时直接指定权限

③删除空目录 rmdir

rmdir

选项:

-p 递归删除父空目录
-v 显示详细信息

注:rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树

三.文件元数据和节点表结构

每个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)。这此元数
据是存放在inode(index node)表中。inode 表中有很多条记录组成,第一条记录对应的存放了一个
文件的元数据信息

1 inode 表结构

每一个inode表记录对应的保存了以下信息:

inode number 节点号
文件类型
权限
UID
GID
链接数(指向这个文件名路径名称个数)
该文件的大小和不同的时间戳
指向磁盘上文件的数据块指针
有关文件的其他数据

目录:目录是个特殊文件,目录文件的内容保存了此目录中文件的列表及inode number对应关系

文件引用一个是 inode号
人是通过文件名来引用一个文件
一个目录是目录下的文件名和文件inode号之间的映射

cp 命令:

分配一个空闲的inode号,在inode表中生成新条目
在目录中创建一个目录项,将名称与inode编号关联
拷贝数据生成新的文件

rm 命令:

链接数递减,从而释放的inode号可以被重用
把数据块放在空闲列表中
删除目录项
数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖

mv命令:

  • 如果mv命令的目标和源在相同的文件系统,作为mv 命令
    用新的文件名创建对应新的目录项
    删除旧目录条目对应的旧的文件名
    不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
  • 如果目标和源在一个不同的文件系统, mv相当于cp和rm

2 硬(hard)链接

硬链接本质上就给一个文件起一个新的名称,实质是同一个文件

ln filename [linkname ]

特性:

创建硬链接会在对应的目录中增加额外的记录项以引用文件
对应于同一文件系统上一个物理文件
每个目录引用相同的inode号
创建时链接数递增
删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文件被删除
不能跨越驱动器或分区
不支持对目录创建硬链接

3 符号 symbolic (或软 soft)链接

一个符号链接指向另一个文件,就像 windows 中快捷方式,软链接文件和原文件本质上不是同一个文件

ln -s filename [linkname]

特点:

一个符号链接的内容是它引用文件的名称
可以对目录创建软链接
可以跨分区的文件实现
指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数
在创建软链接时, 如果源文件使用相对路径,是相对于软链接文件的路径,而非相对于当前工作目录,但是软链接的路径如果是相对路径,则是相对于当前工作目录

4 硬链接和软链接区别总结

  1. 本质:
    硬链接:本质是同一个文件
    软链接:本质不是同一个文件
  2. 跨设备
    硬链接:不支持
    软链接:支持
  3. inode
    硬链接:相同
    软链接:不同
  4. 链接数
    硬链接:创建新的硬链接,链接数会增加,删除硬链接,链接数减少
    软链接:创建或删除,链接数不会变化
  5. 文件夹
    硬链接:不支持
    软链接:支持
  6. 相对路径
    硬链接:原始文件相对路径是相对于当前工作目录
    软链接:原始文件的相对路径是相对于链接文件的相对路径
  7. 删除源文件
    硬链接:只是链接数减一,但链接文件的访问不受影响
    软链接:链接文件将无法访问
  8. 文件类型
    硬链接:和源文件相同
    软链接:链接文件,和源文件无关
  9. 文件大小
    硬链接: 和源文件相同
    软链接: 源文件的路径的长度

5 生产案例

① 案例 1####

案例1:提示空间满 No space left on device,但 df 可以看到空间很多,为什么?

答案: inode使用完毕

②案例 2

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

答案: 文件正在使用,需要把文件放空,例如:

cat /dev/null > /var/log/huge.log

四.IO重定向和管道

1 标准输入和输出

Linux给程序提供三种 I/O 设备

标准输入(STDIN) -0 默认接受来自终端窗口的输入
标准输出(STDOUT)-1 默认输出到终端窗口
标准错误(STDERR) -2 默认输出到终端窗口

2 I/O重定向 redirect

I/O重定向:将默认的输入,输出或错误对应的设备改变,指向新的目标

2.1 标准输出和错误重新定向

STDOUT和STDERR可以被重定向到指定文件,而非默认的当前终端

命令 操作符号 文件名

支持的操作符号包括:

1> 或 >     把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把标准输出和错误都重定向
& 和上面功能一样,建议使用上面方式

以上如果文件已存在,文件内容会被覆盖

set  -C 禁止将内容覆盖已有文件,但可追加, 利用 >| 仍可强制覆盖
set  +C 允许覆盖,默认

标准输出和错误输出各自定向至不同位置

COMMAND > /path/to/file.out 2> /path/to/error.out

合并标准输出和错误输出为同一个数据流进行重定向

&> 覆盖重定向
&>> 追加重定向
COMMAND > /path/to/file.out 2>&1 (顺序很重要)
COMMAND >> /path/to/file.out 2>&1

合并多个程序

(CMD1;CMD2......) 或者{ CMD1;CMD2;....; }合并多个程序的STDOUT

2.2 标准输入重定向

从文件中导入STDIN,代替当前终端的输入设备,使用 < 来重定向标准输入
某些命令能够接受从文件中导入的STDIN

2.2.1 tr 命令

tr 转换和删除字符

tr [OPTION]... SET1 [SET2]

选项:

-d --delete:删除所有属于第一字符集的字符
-s --squeeze-repeats:把连续重复的字符以单独一个字符表示,即去重
-t  --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符
-c –C --complement:取字符集的补集

\NNN           character with octal value NNN (1 to 3 octal digits)
\             backslash
\a             audible BEL
\b             backspace
\f             form feed
\n             new line
\r             return
\t             horizontal tab
\v             vertical tab

[:alnum:]:字母和数字
[:alpha:]:字母
[:digit:]:数字
[:lower:]:小写字母
[:upper:]:大写字母
[:space:]:空白字符
[:print:]:可打印字符
[:punct:]:标点符号
[:graph:]:图形字符
[:cntrl:]:控制(非打印)字符
[:xdigit:]:十六进制字符

2.2.2 标准输入重定向

实现标准输入重定向的符号

COMMAND 0< FILE
COMMAND < FILE

2.2.3 把多行重定向

使用 "<<终止词" 命令从键盘把多行重导向给STDIN,直到终止词位置之前的所有文本都发送给STDIN,有时被称为就地文本(here documents)

其中终止词可以是任何一个或多个符号,比如:!,@,$,EOF(End Of File),等,其中EOF比较常用

3 管道

3.1 管道

管道(使用符号“|”表示)用来连接多个命令

命令1 | 命令2 | 命令3 | …

功能说明:

将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN
所有命令会在当前shell进程的子shell进程中执行
组合多种工具的功能

注:STDERR默认不能通过管道转发,可利用2>&1 或 |& 实现,格式如下

命令1 2>&1 | 命令2
命令1 |& 命令2

3.2 tee 命令

利用 tee 命令可以重定向到多个目标,经常配合管道符一起使用

命令1 | tee [-a ] 文件名 | 命令2

以上可以把命令1的STDOUT保存在文件中,做为命令2的输入

选项:

a 追加

功能:

  • 保存不同阶段的输出
  • 复杂管道的故障排除
  • 同时查看和记录输出

4 重定向中的 - 符号

posted on 2021-01-09 21:24  求墨  阅读(144)  评论(0编辑  收藏  举报