文件操作相关命令
pwd
1 | [root@centos7 bin]# pwd |
basename 和 dirname
1 | [root@4710419222 vhost]# pwd |
cd
1 | [root@4710419222 ~]# cd -P /bin/ # -P 切换至物理路径, 而非软链接目录 |
切换到来时的目录:cd -
ls
1 | [root@47105171233 ~]# ll -A # 显示隐藏文件,但是不显示.和.. |
说明: ls 查看不同后缀文件时的颜色由 /etc/DIR_COLORS 和 @LS_COLORS 变量定义
stat
1 | [root@4710419222 ~]# stat test.php |
file
判断文件的类型不能依靠后缀,可以使用 file 命令判断文件的类型
hexdump
一般用来查看“二进制”文件的十六进制编码,但实际上它能查看任何文件,而不只限于二进制文件
1 | [root@4710419222 ~]# hexdump -C test.txt # -C 输出规范的十六进制和ASCII码 |
文件通配符 glob
文件通配符可以用来匹配符合条件的多个文件,方便批量管理文件
1 | # * 匹配零个或多个字符, 但不匹配隐藏文件 |
此外, 还有预定义的字符类: man 7 glob
1 | [:digit:]:任意数字,相当于0-9 |
文件通配符(glob)和正则表达式(regex):
- 文件通配符就是
* ? []
这三个,正则表达式则功能强大 - **对于
*
**文件通配符中*
匹配 0 个或多个字符,可以单独使用。而在正则表达式中*
是匹配前面的 0 次或多次,前面必须由内容,不能单独使用 - 对于
?
和*
一样,文件通配符中,?
可以单独使用,正则表达式中不可以 - **对于
[]
**文件通配符[]
中的内容是按照 ASCII 统计的,例如[a-z]
会匹配 a、A、b、B…y、Y、z,而正则表达式[]
中的内容是按照人类的方式统计,例如[a-z]
会匹配 a、b、c、d、e…x、y、z - 对于
.
文件通配符中.
就是.
,没有别的意思,正则表达式中.
匹配单个字符
touch
创建空文件和 刷新文件时间
1 | # -a 仅改变 atime和ctime |
cp
1 | -a # 归档,相当于-dR --preserv=all,常用于备份功能 |
注意:不同类型的文件不能覆盖,例如普通文件可以覆盖普通文件,但是不能覆盖目录
1 | [root@4710419222 test]# ll |
mv
移动和重命名文件,同一分区移动会很快
1 | mv [OPTION]... [-T] SOURCE DEST # 移动并重命名 |
mv
和 rename
:mv
一次只能重命名一个文件,rename
可以批量重命名文件
rename
1 | rename [options] <expression> <replacement> <file>... |
这个命令好像可以使用正则,但是我试了一下,不行,可能是版本的问题
rm

此命令非常危险, 建议使用 mv 替代 rm
1 | alias rm='DIR=/data/backup`date +%F%T`;mkdir $DIR;mv -t $DIR' |
rm 虽然删除了文件,但是在安全场景要求较高的情况下,可以使用 shred 命令安全删除文件
1 | [root@centos8 ~]#shred -zvun 5 passwords.txt |
tree
显示目录树
df
查看文件系统,显示磁盘占用情况和 inode 使用情况
1 | df [选项列表]... [文件列表]... |
- -a –all
- -h –human-readable
- -i –inodes 显示 inode 信息而非块使用量
关于 df 和 lsblk:
1 | lsblk 查看的是block device,也就是逻辑磁盘大小。df查看的是file system, 也就是文件系统层的磁盘大小 |
mkdir
1 | -p 目录如果不存在,创建,如果存在,不报错 |
rmdir
1 | -p 递归删除父空目录 |
挂载点不能删除
tee
从标准输入读入并写往标准输出和文件,把标准输入的数据复制到文件列表中的每一个文件,同时送往标准输出
1 | tee [选项]... [文件列表]... |
1 | [root@centos8 ~]#cat <<EOF | tee /etc/motd |
lsof
linux 下万物皆文件,网络也是文件,lsof 的作用是列出打开的文件
lsof 的参数巨多,下面列举常用的参数:
1 | lsof file # 查看文件被哪些进程占用 |
示例:
1 | [root@k8s-master ~]$lsof -i:10252 |
seq
https://www.zsythink.net/archives/128/
输出连续的数字,或者固定间隔的数字,或者指定格式的数字
1 | [root@centos8 ~]# seq 0 9 |
练习题
将/etc/issue 文件中的内容转换为大写后保存至/tmp/issue.out 文件中
1
[root@centos7 test]# cat /etc/issue | tr 'a-z' 'A-Z' > /tmp/issue.out
将当前系统登录用户的信息转换为大写后保存至/tmp/who.out 文件中
1
[root@centos7 test]# whoami | tr 'a-z' 'A-Z' > /tmp/who.out
一个 linux 用户给 root 发邮件,要求邮件标题为”help”,邮件正文如下:
Hello,I am 用户名,The system version is here,please help me to check it,thanks!
操作系统版本信息1
[root@centos8 ~]# echo -e "Hello, I am `whoami`,The system version is here,please help me to check it ,thanks! \n`cat /etc/os-release`" | mail -s hello root
将/root/下文件列表,显示成一行,并文件名之间用空格隔开
1
[root@4710419222 /]# ls -A /root | tr '\n' ' '
计算 1+2+3+…+99+100 的总和
1
2[root@centos8 test]# seq -s + 1 100 | bc
5050删除 Windows 文本文件中的回车字符 ,即“\r”
1
cat a.log | tr '\r' ' '
处理字符串“xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的数字和空格
1
2[root@centos8 test]# echo 'xt.,l 1 jr#!$mn 2 c*/fe 3 uz 4' | tr -dc '0-9 '
1 2 3 4[root@centos8 test]#将 PATH 变量每个目录显示在独立的一行
1
[root@centos8 test]# echo $PATH | tr ':' '\n'
将指定文件中 0-9 分别替代成 a-j
1
[root@centos8 test]# cat a.log | tr '0-9' 'a-j'
将文件/etc/centos-release 中每个单词(由字母组成)显示在独立一行,并无空行
1
2
3
4
5[root@centos8 test]# cat /etc/centos-release | tr -c "[:alpha:]" " " | tr -s " " "\n"
CentOS
Linux
release
Corels
输出的内容明明是分行的, 为什么显示出来就不分行了?不单
ls
会这样,不少其他命令也会这样。它们会使用 isatty 函数查询输出是否指向终端,对输出到终端和非终端的处理,可能不一样常见的比如:
1、输出到终端时,使用 color,非终端则不用;
2、输出到终端时,使用 text 方式,非终端则用 binary。如果需要一致的输出,应当明确使用相关参数
這取決於 stdout 是不是終端。如果是終端就可以讀取終端的寬度,根據寬度排版。