1、文件系统目录结构
![图片[1]-文件管理-李佳程的个人主页](http://39.101.72.1/wp-content/uploads/2022/11/image-24.png)
1.1、文件系统的目录结构
- 文件和目录被组织成一个单根倒置树结构
- 文件系统从根目录下开始,用“/”表示
- 根文件系统(rootfs):root filesystem
- 标准Linux文件系统(如:ext4、xfs),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL
- 以 . 开头的文件为隐藏文件
- 路径分隔的 /
- 文件名最长255个字节
- 包括路径在内文件名称最长4095个字节
- 蓝色–>目录,绿色–>可执行文件,红色–>压缩文件,浅蓝色–>链接文件,灰色–>其他文件
- 除了斜杠和NUL,所有字符都有效,但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用
- 每个文件都有两类相关数据:元数据:metadata,即属性, 数据:data,即文件内容
- Linux的文件系统分层结构:FHS Filesystem Hierarchy Standard
1.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:第三方应用程序的安装位置
- bin, sbin, lib, lib64, etc, share
- /var: variable data files
- cache: 应用程序缓存数据目录
- lib: 应用程序状态信息数据
- local:专用于为/usr/local下的应用程序存储可变数据
- lock: 锁文件
- log: 日志目录及文件
- opt: 专用于为/opt下的应用程序存储可变数据
- run: 运行中的进程相关数据,通常用于存储进程pid文件
- spool: 应用程序数据池
- tmp: 保存系统两次重启之间产生的临时数据
- /proc: 用于输出内核与进程信息相关的虚拟文件系统
- /sys:用于输出当前系统上硬件设备相关信息虚拟文件系统
- /selinux: security enhanced Linux,selinux相关的安全策略等信息的存储位置
1.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/doc
1.4、Linux下的文件类型
- – 普通文件
- d 目录文件directory
- l 符号链接文件link
- b 块设备block
- c 字符设备character
- p 管道文件pipe
- s 套接字文件socket
2、文件操作命令
2.1、显示当前工作目录
- 每个shell和系统进程都有一个当前的工作目录 CWD:current work directory
- 显示当前shell CWD的绝对路径
- pwd命令: printing working directory
- -P 显示真实物理路径
- -L 显示链接路径(默认)
[root@centos79_test file]# pwd
/root/file
2.2、绝对路径和相对路径
- 绝对路径
- 以正斜杠/ 即根目录开始
- 完整的文件的位置路径
- 可用于任何想指定一个文件名的时候
- 相对路径名
- 不以斜线开始
- 一般情况下,是指相对于当前工作目录的路径,特殊场景下,是相对于某目录的位置
- 可以作为一个简短的形式指定一个文件名
- 基名:basename,只取文件名而不要路径
- 目录名:dirname,只取路径,不要文件名
[root@centos79_test ~]# basename /etc/sysconfig/network-scripts/ifcfg-eth0
ifcfg-eth0
[root@centos79_test ~]# dirname /etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts
2.3、更改目录
- 命令 cd : change directory 改变目录
- -P 切换至物理路径,而非软链接目录
- 可以使用绝对或相对路径
- 切换至父目录: cd ..
- 切换至当前用户主目录: cd
- 切换至以前的工作目录: cd –
[root@centos79_test network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@centos79_test network-scripts]# cd ..
[root@centos79_test sysconfig]# pwd
/etc/sysconfig
[root@centos79_test sysconfig]# cd
[root@centos79_test ~]# pwd
/root
[root@centos79_test ~]# cd -
/etc/sysconfig
[root@centos79_test sysconfig]# pwd
/etc/sysconfig
2.3、列出目录内容
ls 命令可以列出当前目录的内容或指定目录
ls 查看不同后缀文件时的颜色由 /etc/DIR_COLORS 和@LS_COLORS变量定义
ls -l 看到文件的大小,不一定是实际文件真正占用空间的大小
ls [options] [files_or_dirs]
- -a 包含隐藏文件
- -l 显示额外的信息
- -R 目录递归
- -ld 目录和符号链接信息
- -1 文件分行显示
- -S 按从大到小排序
- -t 按mtime排序
- -u 配合-t选项,显示并按atime从新到旧排序
- -U 按目录存放顺序显示
- -X 按文件后缀排序
- -F 对不同类型文件显示时附加不同的符号:*/=>@|
- -C 文件多时,以多列的方式显示文件,默认是一列(标准输出)
![图片[2]-文件管理-李佳程的个人主页](http://39.101.72.1/wp-content/uploads/2022/11/image-25.png)
2.4、查看文件状态stat
- 每个文件有三个时间戳:
- access time 访问时间,atime,读取文件内容
- modify time 修改时间,mtime,改变文件内容(数据)
- change time 改变时间,ctime,元数据发生改变
![图片[3]-文件管理-李佳程的个人主页](http://39.101.72.1/wp-content/uploads/2022/11/image-26.png)
2.5、确定文件内容
文件可以包含多种类型的数据,使用file命令检查文件的类型,然后确定适当的打开命令或应用程序使用
file [options] <filename>...
- -b 列出文件辨识结果时,不显示文件名称
- -f filelist 列出文件filelist中文件名的文件类型
- -F 使用指定分隔符号替换输出文件名后默认的”:”分隔符
- -L 查看对应软链接对应文件的文件类型
- –help 显示命令在线帮助
[root@centos79_test ~]# file 2022-11-08.txt
2022-11-08.txt: empty
2.6、文件通配符模式 wildcard pattern
文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件
通配符采有特定的符号,表示特定的含义,此特符号称为元 meta 字符
#常用通配符
* 匹配零个或多个字符,但不匹配 "." 开头的文件,即隐藏文件
? 匹配任何单个字符,一个汉字也算一个字符
~ 当前用户家目录
~mumu 用户mumu家目录
[0-9] 匹配数字范围
[a-z] 一个字母
[A-Z] 一个字母
[linux] 匹配列表中的任何的一个字符
[^linux] 匹配列表中的所有字符以外的字符
[^a-z] 匹配列表中的所有字符以外的字符
. 和 ~+ 当前工作目录
~- 前一个工作目录
#Linux系统中预定义的字符类表示法
[:digit:]: 任意数字,相当于0-9
[:lower:]: 任意小写字母,表示 a-z
[:upper:]: 任意大写字母,表示 A-Z
[:alpha:]: 任意大小写字母
[:alnum:]: 任意数字或字母
[:blank:]: 水平空白字符
[:space:]: 水平或垂直空白字符
[:punct:]: 标点符号
[:print:]: 可打印字符
[:cntrl:]: 控制(非打印)字符
[:graph:]: 图形字符
[:xdigit:]:十六进制字符
#范例
[root@centos79_test file]# touch {a..z}.file
[root@centos79_test file]# touch {A..Z}.file
[root@centos79_test file]# touch {1..100}.file
[root@centos79_test file]# ls
100.file 17.file 24.file 31.file 39.file 46.file 53.file 60.file 68.file 75.file 82.file 8.file 97.file c.file g.file k.file o.file s.file w.file 10.file 18.file 25.file 32.file 3.file 47.file 54.file 61.file 69.file 76.file 83.file 90.file 98.file C.file G.file K.file O.file S.file W.file 11.file 19.file 26.file 33.file 40.file 48.file 55.file 62.file 6.file 77.file 84.file 91.file 99.file d.file h.file l.file p.file t.file x.file 12.file 1.file 27.file 34.file 41.file 49.file 56.file 63.file 70.file 78.file 85.file 92.file 9.file D.file H.file L.file P.file T.file X.file 13.file 20.file 28.file 35.file 42.file 4.file 57.file 64.file 71.file 79.file 86.file 93.file a.file e.file i.file m.file q.file u.file y.file 14.file 21.file 29.file 36.file 43.file 50.file 58.file 65.file 72.file 7.file 87.file 94.file A.file E.file I.file M.file Q.file U.file Y.file 15.file 22.file 2.file 37.file 44.file 51.file 59.file 66.file 73.file 80.file 88.file 95.file b.file f.file j.file n.file r.file v.file z.file 16.file 23.file 30.file 38.file 45.file 52.file 5.file 67.file 74.file 81.file 89.file 96.file B.file F.file J.file N.file R.file V.file Z.file
[root@centos79_test file]# ls [1-5].file
1.file 2.file 3.file 4.file 5.file
[root@centos79_test file]# ls [linux].file
i.file l.file n.file u.file x.file
[root@centos79_test file]# ls [:lower:].file
e.file l.file o.file r.file w.file
[root@centos79_test file]# ls [[:lower:]].file
a.file c.file e.file g.file i.file k.file m.file o.file q.file s.file u.file w.file y.file b.file d.file f.file h.file j.file l.file n.file p.file r.file t.file v.file x.file z.file
2.7、创建空文件和刷新时间
touch命令可以用来创建空文件或刷新文件的时间
touch [OPTION]... FILE...
- -a 仅改变 atime和ctime
- -m 仅改变 mtime和ctime
- -t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的时间戳
- -c 如果文件不存在,则不予创建
#范例
[root@centos79_test file]# touch file1
[root@centos79_test file]# ll file1
-rw-r--r-- 1 root root 0 Nov 8 10:11 file1
[root@centos79_test file]# date
Tue Nov 8 10:12:26 CST 2022
[root@centos79_test file]# touch `date -d "-1 day" +%F_%T`.log
[root@centos79_test file]# ll
total 0
-rw-r--r-- 1 root root 0 Nov 8 10:12 2022-11-07_10:12:41.log
-rw-r--r-- 1 root root 0 Nov 8 10:11 file1
[root@centos79_test file]# touch `date -d "1 year" +%F_%T`.log
[root@centos79_test file]# ll
total 0
-rw-r--r-- 1 root root 0 Nov 8 10:12 2022-11-07_10:12:41.log
-rw-r--r-- 1 root root 0 Nov 8 10:13 2023-11-08_10:13:15.log
-rw-r--r-- 1 root root 0 Nov 8 10:11 file1
2.8、复制文件和目录
利用 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.~#~ ,可以保留多个版本
#范例
[root@centos79_test copy]# cp -r /var/log/* .
[root@centos79_test copy]# ls
anaconda btmp dmesg.old lastlog rhsm tallylog vmware-network.2.log vmware-vmsvc-root.log yum.log
audit cron firewalld maillog secure tuned vmware-network.log vmware-vmtoolsd-root.log
boot.log dmesg grubby_prune_debug messages spooler vmware-network.1.log vmware-vgauthsvc.log.0 wtmp
[root@centos79_test copy]# cp -a /etc/fstab .
[root@centos79_test copy]# ll
total 4
-rw-r--r--. 1 root root 465 Nov 8 2022 fstab
如果是生产环境,那么复制并覆盖前一定要备份被覆盖数据,以免造成生产事故!
2.9、移动和重命名文件
- mv 命令可以实现文件或目录的移动和改名
- 同一分区移动数据,速度很快,数据位置没有变化
- 不同分区移动数据,速度相对慢,数据位置发生了变化
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
- -i 交互式
- -f 强制
- -b 目标存在,覆盖前先备份
#范例
[root@centos79_test copy]# ll
total 4
-rw-r--r--. 1 root root 465 Nov 8 2022 fstab
[root@centos79_test copy]# cp fstab fstab1
[root@centos79_test copy]# ll
total 8
-rw-r--r--. 1 root root 465 Nov 8 2022 fstab
-rw-r--r-- 1 root root 465 Nov 8 10:25 fstab1
[root@centos79_test copy]# mv -bf fstab fstab1
[root@centos79_test copy]# ll
total 8
-rw-r--r--. 1 root root 465 Nov 8 2022 fstab1
-rw-r--r-- 1 root root 465 Nov 8 10:25 fstab1~
#利用 rename 可以批量修改文件名
rename [options] <expression> <replacement> <file>...
#为所有的f开头包含conf的文件加上.bak后缀:
rename 'conf' 'conf.bak' f*
#去掉所有的bak后缀:
rename '.bak' '' *.bak
2.10、删除文件
使用 rm 命令可以删除文件和目录(此命令非常危险,慎重使用)
rm [OPTION]... FILE...
- -i 交互式
- -f 强制删除
- -r 递归
- –no-preserve-root 删除/
#范例
[root@centos79_test copy]# ll
total 8
-rw-r--r--. 1 root root 465 Nov 8 2022 fstab1
-rw-r--r-- 1 root root 465 Nov 8 10:25 fstab1~
[root@centos79_test copy]# rm -rf fstab1
[root@centos79_test copy]# ll
total 4
-rw-r--r-- 1 root root 465 Nov 8 10:25 fstab1~
#使用*通配符删除文件时一定要慎重,确认好需要删除的文件所在目录
2.11、目录操作
- 显示目录树 tree
- -d: 只显示目录
- -L level:指定显示的层级数目
- -P pattern: 只显示由指定wild-card pattern匹配到的路径
- 创建目录 mkdir
- -p: 存在于不报错,且可自动创建所需的各目录
- -v: 显示详细信息
- -m MODE: 创建目录时直接指定权限
- 删除空目录 rmdir
- -p 递归删除父空目录
- -v 显示详细信息
- rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树
3、文件元数据和节点表结构
3.1、inode 表结构
每个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)。这此元数
据是存放在inode(index node)表中。inode 表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息。
每一个inode表记录对应的保存了以下信息:
- inode number 节点号
- 文件类型
- 权限
- UID
- GID
- 链接数(指向这个文件名路径名称个数)
- 该文件的大小和不同的时间戳
- 指向磁盘上文件的数据块指针
- 有关文件的其他数据
![图片[4]-文件管理-李佳程的个人主页](http://39.101.72.1/wp-content/uploads/2022/11/image-27.png)
目录
目录是个特殊文件,目录文件的内容保存了此目录中文件的列表及inode number对应关系
- 文件引用一个是 inode号
- 人是通过文件名来引用一个文件
- 一个目录是目录下的文件名和文件inode号之间的映射
![图片[5]-文件管理-李佳程的个人主页](http://39.101.72.1/wp-content/uploads/2022/11/image-28.png)
- cp 命令
- 分配一个空闲的inode号,在inode表中生成新条目
- 在目录中创建一个目录项,将名称与inode编号关联
- 拷贝数据生成新的文件
- rm 命令
- 链接数递减,从而释放的inode号可以被重用
- 把数据块放在空闲列表中
- 删除目录项
- 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
- mv命令
- 如果mv命令的目标和源在相同的文件系统,作为mv 命令
- 用新的文件名创建对应新的目录项
- 删除旧目录条目对应的旧的文件名
- 不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
- 如果目标和源在一个不同的文件系统, mv相当于cp和rm
- 如果mv命令的目标和源在相同的文件系统,作为mv 命令
#删除/清空大文件
cat /dev/null > /var/log/message.log
#查看inode使用情况
[root@centos79_test ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 479660 395 479265 1% /dev
tmpfs 482661 1 482660 1% /dev/shm
tmpfs 482661 1281 481380 1% /run
tmpfs 482661 16 482645 1% /sys/fs/cgroup
/dev/mapper/centos-root 8910848 41243 8869605 1% /
/dev/sda1 524288 327 523961 1% /boot
tmpfs 482661 1 482660 1% /run/user/0
#当inode使用率偏高时,使用命令查看哪个目录下inode使用异常,然后删除异常的文件释放inode
for i in /*; do echo $i; find $i | wc -l; done
3.2、硬链接
硬链接本质上就给一个文件起一个新的名称,实质是同一个文件
- 创建硬链接会在对应的目录中增加额外的记录项以引用文件
- 对应于同一文件系统上一个物理文件
- 每个目录引用相同的inode号
- 创建时链接数递增
- 删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文件被删除
- 不能跨越驱动器或分区
- 不支持对目录创建硬链接
ln filename [linkname ]
3.3、软连接
一个符号链接指向另一个文件,就像 windows 中快捷方式,软链接文件和原文件本质上不是同一个文件
- 一个符号链接的内容是它引用文件的名称
- 可以对目录创建软链接
- 可以跨分区的文件实现
- 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数
- 在创建软链接时, 如果源文件使用相对路径,是相对于软链接文件的路径,而非相对于当前工作目录,但是软链接的路径如果是相对路径,则是相对于当前工作目录
ln -s filename [linkname]
rm -rf /data/dirlink #只删除软链接本身,不会删除源目录内容
rm -rf /data/dirlink/ #删除源目录的文件,但不会删除链接文件,此方法非常危险
#删除此软链接务必不要加-r选
3.4、硬链接和软链接区别
- 本质:
- 硬链接:本质是同一个文件
- 软链接:本质不是同一个文件
- 跨设备
- 硬链接:不支持
- 软链接:支持
- inode
- 硬链接:相同
- 软链接:不同
- 链接数
- 硬链接:创建新的硬链接,链接数会增加,删除硬链接,链接数减少
- 软链接:创建或删除,链接数不会变化
- 文件夹
- 硬链接:不支持
- 软链接:支持
- 相对路径
- 硬链接:原始文件相对路径是相对于当前工作目录
- 软链接:原始文件的相对路径是相对于链接文件的相对路径
- 删除源文件
- 硬链接:只是链接数减一,但链接文件的访问不受影响
- 软链接:链接文件将无法访问
- 文件类型
- 硬链接:和源文件相同
- 软链接:链接文件,和源文件无关
- 文件大小
- 硬链接: 和源文件相同
- 软链接: 源文件的路径的长度
4、IO 重定向和管道
4.1、标准输入和输出
程序:指令+数据
读入数据:Input
输出数据:Output
打开的文件都有一个fd: file descriptor (文件描述符)
Linux给程序提供三种 I/O 设备:
- 标准输入(STDIN) -0 默认接受来自终端窗口的输入
- 标准输出(STDOUT)-1 默认输出到终端窗口
- 标准错误(STDERR) -2 默认输出到终端窗口
[root@centos79_test ~]# ll /dev/std*
lrwxrwxrwx 1 root root 15 Nov 8 2022 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Nov 8 2022 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Nov 8 2022 /dev/stdout -> /proc/self/fd/1
4.2、I/O重定向 redirect
将默认的输入,输出或错误对应的设备改变,指向新的目标
STDOUT和STDERR可以被重定向到指定文件,而非默认的当前终端
命令 操作符号 文件名
#操作符号
1> 或 > 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把标准输出和错误都重定向
>& 和上面功能一样,建议使用上面方式
#以上如果文件已存在,文件内容会被覆盖
#追加
# >> 可以在原有内容基础上,追加内容
>> 追加标准输出重定向至文件
2>> 追加标准错误重定向至文件
#标准输出和错误输出各自定向至不同位置
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
[root@centos79_test ~]# { ls;hostname;} > /root/all.log
[root@centos79_test ~]# cat all.log
2022-11-08.txt
all.log
anaconda-ks.cfg
copy
date
+%F
file
centos79_test
4.3、标准输入重定向
从文件中导入STDIN,代替当前终端的输入设备,使用 < 来重定向标准输入
某些命令能够接受从文件中导入的STDIN
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:]:十六进制字符
#范例
[root@centos79_test tr]# tr -d abc < fstab
#
# /et/fst
# Creted y nond on Tue Nov 8 14:51:00 2022
#
# Aessile filesystems, y referene, re mintined under '/dev/disk'
# See mn pges fst(5), findfs(8), mount(8) nd/or lkid(8) for more info
#
/dev/mpper/entos-root / xfs defults 0 0
UUID=f418182-36-4-94d-46e44002e /oot xfs defults 0 0
/dev/mpper/entos-swp swp swp defults 0 0
[root@centos79_test tr]# tr ‘a-z’ ‘A-Z’< fstab
#
# /ETC/FSTAB
# CREATED BY ANACONDA ON TUE NOV 8 14:51:00 2022
#
# ACCESSIBLE FILESYSTEMS, BY REFERENCE, ARE MAINTAINED UNDER '/DEV/DISK'
# SEE MAN PAGES FSTAB(5), FINDFS(8), MOUNT(8) AND/OR BLKID(8) FOR MORE INFO
#
/DEV/MAPPER/CENTOS-ROOT / XFS DEFAULTS 0 0
UUID=F4A18182-B3A6-4CBA-94CD-46CE44C002CE /BOOT XFS DEFAULTS 0 0
/DEV/MAPPER/CENTOS-SWAP SWAP SWAP DEFAULTS 0 0
#范例
[root@centos79_test tr]# df -h > df.log
[root@centos79_test tr]# cat df.log
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 1.6G 16G 10% /
/dev/sda1 1014M 151M 864M 15% /boot
tmpfs 378M 0 378M 0% /run/user/0
[root@centos79_test tr]# tr -s ' ' <df.log
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 1.6G 16G 10% /
/dev/sda1 1014M 151M 864M 15% /boot
tmpfs 378M 0 378M 0% /run/user/0
[root@centos79_test tr]# tr -s ' ' - <df.log
Filesystem-Size-Used-Avail-Use%-Mounted-on
devtmpfs-1.9G-0-1.9G-0%-/dev
tmpfs-1.9G-0-1.9G-0%-/dev/shm
tmpfs-1.9G-12M-1.9G-1%-/run
tmpfs-1.9G-0-1.9G-0%-/sys/fs/cgroup
/dev/mapper/centos-root-17G-1.6G-16G-10%-/
/dev/sda1-1014M-151M-864M-15%-/boot
tmpfs-378M-0-378M-0%-/run/user/0
#范例
[root@centos79_test tr]# cat > cat.log
1
2
3
gggafsd
#按ctrl+d
[root@centos79_test tr]# cat cat.log
1
2
3
gggafsd
[root@centos79_test tr]# cat <cat.log > cat1.log
[root@centos79_test tr]# cat cat1.log
1
2
3
gggafsd
4.4、多行重定向
使用 “<<终止词” 命令从键盘把多行重导向给STDIN,直到终止词位置之前的所有文本都发送给 STDIN,有时被称为就地文本(here documents)
其中终止词可以是任何一个或多个符号,比如:!,@,$,EOF(End Of File)等,其中EOF 比较常用
#范例
[root@centos79_test tr]# cat > cat5.log <<EOF
CAT1
CAT2
CAT3
CAT4
FINISH
EOF
[root@centos79_test tr]# cat cat5.log
CAT1
CAT2
CAT3
CAT4
FINISH
4.5、高级重定向写法
cmd <<< “string”
含义是 here-string ,表示传给给cmd的stdin的内容从这里开始是一个字符串。
#范例
[root@centos79_test tr]# tr 'a-z' 'A-Z' <<<"hello world"
HELLO WORLD
cmd1 < <(cmd2)
名称为 Process substitution ,是由两个部分组成
<(cmd2) 表示把cmd2的输出写入一个临时文件, 注意:<和(之间无空格
cmd1 < 这是一个标准的stdin重定向 把两个合起来,就是把cmd2的输出stdout传递给cmd1作为输入stdin, 中间通过临时文件做传递
#范例
[root@centos79_test tr]# tr 'a-z' 'A-Z' < <(echo hello world)
HELLO WORLD
4.6、管道
管道(使用符号“|”表示)用来连接多个命令
命令1 | 命令2 | 命令3 | …
- 将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN
- 所有命令会在当前shell进程的子shell进程中执行
- 组合多种工具的功能
STDERR默认不能通过管道转发,可利用2>&1 或 |& 实现
命令1 2>&1 | 命令2
命令1 |& 命令2
#范例
[root@centos79_test tr]# ll
total 20
-rw-r--r-- 1 root root 14 Nov 8 11:22 cat1.log
-rw-r--r-- 1 root root 29 Nov 8 11:25 cat5.log
-rw-r--r-- 1 root root 14 Nov 8 11:20 cat.log
-rw-r--r-- 1 root root 441 Nov 8 11:17 df.log
-rw-r--r--. 1 root root 465 Nov 8 2022 fstab
[root@centos79_test tr]# cat fstab | grep UUID
UUID=f4a18182-b3a6-4cba-94cd-46ce44c002ce /boot xfs defaults 0 0
[root@centos79_test tr]# cat fstab | grep UUID | tr 'a-z' 'A-Z'
UUID=F4A18182-B3A6-4CBA-94CD-46CE44C002CE /BOOT XFS DEFAULTS 0 0
[root@centos79_test tr]# ll fstab fstab1 | tr 'a-z' 'A-Z'
ls: cannot access fstab1: No such file or directory
-RW-R--R--. 1 ROOT ROOT 465 NOV 8 2022 FSTAB
[root@centos79_test tr]# ll fstab fstab1 2>&1 | tr 'a-z' 'A-Z'
LS: CANNOT ACCESS FSTAB1: NO SUCH FILE OR DIRECTORY
-RW-R--R--. 1 ROOT ROOT 465 NOV 8 2022 FSTAB
[root@centos79_test tr]# ll fstab fstab1 |& tr 'a-z' 'A-Z'
LS: CANNOT ACCESS FSTAB1: NO SUCH FILE OR DIRECTORY
-RW-R--R--. 1 ROOT ROOT 465 NOV 8 2022 FSTAB
#范例
[root@centos79_test ~]# passwd --stdin root
Changing password for user root.
root123
passwd: all authentication tokens updated successfully.
[root@centos79_test ~]# echo root1234 | passwd --stdin root
Changing password for user root.
passwd: all authentication tokens updated successfully.
[root@centos79_test ~]# echo root123 > pass.txt
[root@centos79_test ~]# cat pass.txt
root123
[root@centos79_test ~]# passwd --stdin root < pass.txt
Changing password for user root.
passwd: all authentication tokens updated successfully.
#范例
#less实现分页地查看输入,按q退出后查看输入消失
ls -l /etc | less
#more实现分页地查看输入,结束后查看输入不会消失
ls -l /etc | more
tee 命令
利用 tee 命令可以重定向到多个目标,经常配合管道符一起使用
命令1 | tee [-a ] 文件名 | 命令2
-a 追加
- 保存不同阶段的输出
- 复杂管道的故障排除
- 同时查看和记录输出
#范例
[root@centos79_test ~]# cat <<EOF | tee hello.log
> hello world1
> hello world11
> hello world111
> hello world1111
> hello world11111
> hello world111111
> EOF
hello world1
hello world11
hello world111
hello world1111
hello world11111
hello world111111