摘自 Linux Shell 脚本攻略 第二章 命令之乐
cat
cat命令是一个经常会用到的简单命令,它本身表示conCATenate(拼接)
打印单个文件的内容
$ cat file.txt
This is a line inside file.txt
This is the second line inside file.txt
打印多个文件的内容
$ cat one.txt two.txt
This line is from one.txt
This line is from two.txt
从标准输入中读取 拼接数据
$ echo 'Text through stdin' | cat - file.txt
Text through stdin
This is a line inside file.txt
This is the second line inside file.txt
在上例中,-被作为stdin文本的文件名
去掉多余的空白行
$ cat -s multi_blanks.txt # 压缩相邻的空白行
line 1
line 2
line 3
line 4
将制表符显示为^I
$ cat file.py
def function():
var = 5
next = 6
third = 7
$ cat -T file.py
def function():
^Ivar = 5
^I^Inext = 6
^Ithird = 7^I
行号
$ cat lines.txt
line
line
line
$ cat -n lines.txt
1 line
2 line
3 line
find
find是Unix/Linux命令行工具箱中最棒的工具之一。该命令在命令行和shell脚本编写方面都 能发挥功效。同cat和ls一样,find也包含大量特性,多数用户都没有发挥出它的最大威力。这 则攻略讨论了find的一些常用的查找功能
列出当前给定目录下所有文件和子目录
$ find 3d/ -print
3d/
3d/[CNUHD] LG 4K3D .mp4
print选项使用\n(换行符)分隔输出的每个文件或目录名。而-print0选项则使用空字符 '\0’来分隔。-print0的主要用法是将包含换行符或空白字符的文件名传给xargs命令
根据文件名或正则表达式进行搜索
$ find . -name '*.sh' -print
./coco.sh
./shift.sh
./debug.sh
在当前目录下 查找所有sh文件
$ find . \( -name '*.sh' -o -name '*.txt' \) -print
./coco.sh
./shift.sh
./docker_command.txt
./1.txt
也可以通过逻辑符添加 匹配逻辑 -a/-and 表示逻辑与 -o/-or表示逻辑或
在当前目录下 查找所有sh和txt文件
使用正则表达式
$ find . -regex '.+\.\(sh\|py\)$'
./for_fun/coco.py
./for_fun/main.py
./coco.sh
./shift.sh
./debug.sh
在当前目录下 查找所有sh或者py结尾的文件
否定参数 取反
$ find . ! -name '*.py'
./sum.txt
./3d
./3d/[CNUHD] LG 4K3D .mp4
./4k
./4k/[4K123]Hercules The Thracian Wars.mp4
./[4KVP9_29.97fps_10Mbps_8bit]UD_Europe_by_Dominic_0725.webm
在当前目录下 查找所有 非txt文件
基于目录深度的搜索
-maxdepth和–mindepth选项可以限制find命令遍历的目录深度。这可以避免find命令没
完没了地查找
$ find -L . -maxdepth 2 -name '*.py'
./for_fun/coco.py
./for_fun/main.py
-L选项告诉find命令跟随符号链接
从当前目录开始查找
-maxdepth 2将搜索范围仅限制在最深两级目录
-name 指定待查找的文件
根据文件类型搜索
find命令可以使用-type选项对文件搜索进行过滤。借助这个选项,我们可以告诉find命令只匹配指定类型的文件
- 只列出所有的目录
$ find . -type d -print
- 只列出普通文件
$ find . -type f -print
- 只列出符号链接
$ find . -type l -print
根据时间戳进行搜索
- 访问时间(-atime):用户最近一次访问文件的时间。
- 打印出在最近7天内被访问过的所有文件
$ find . -type f -atime -7 -print
- 打印出恰好在7天前被访问过的所有文件
$ find . -type f -atime 7 -print
- 打印出访问时间超过7天的所有文件
$ find . -type f -atime +7 -print
- 修改时间(-mtime):文件内容最后一次被修改的时间。
- 变化时间(-ctime):文件元数据(例如权限或所有权)最后一次改变的时间
-mtime选项会根据修改时间展开搜索,-ctime会根据变化时间展开搜索。
-atime、-mtime以及-ctime都是以“天”为单位来计时的。find命令还支持以“分钟”为计时单位的选项。这些选项包括
- -amin(访问时间)
- -mmin(修改时间)
- -cmin(变化时间)
- 打印出7分钟之前访问的所有文件
$ find . -type f -amin +7 -print
- 按照指定文件时间对比 查找
$ find . -type f -newer file.txt -print
找出比file.txt修改时间更近的所有文件
基于文件大小的搜索
- 大于2KB的文件
$ find . -type f -size +2k
- 小于2KB的文件
$ find . -type f -size -2k
- 大小等于2KB的文件
$ find . -type f -size 2k
除了k之外,还可以用其他文件大小单位 b:块(512字节) c:字节 w:字(2字节) k:千字节(1024字节) M:兆字节(1024K字节) G:吉字节(1024M字节)
基于文件权限和所有权的匹配
- 列出具有特定权限的文件
$ find . -type f -perm 644 -print
- 列出某用户拥有的所有文件
find . -type f -user slynux -print
利用find执行相应操作
- 删除匹配的文件
$ ls *.log
kernel.log logcat.log
$ find . -type f -name "*.log" -delete
$ ls *.log
ls: cannot access '*.log': No such file or directory
- 执行命令
利用-exec选项,find命令可以结合其他命令使用
$ ls -l *.sh
-rw-rw-r-- 1 amlogic amlogic 181 11月 15 19:45 coco.sh
-rw-rw-r-- 1 amlogic amlogic 120 11月 8 21:44 debug.sh
-rw-rw-r-- 1 amlogic amlogic 41 11月 15 16:49 shift.sh
$ find -maxdepth 1 -name '*.sh' -exec chmod a+x {} \;
$ ls -l *.sh
-rwxrwxr-x 1 amlogic amlogic 181 11月 15 19:45 coco.sh
-rwxrwxr-x 1 amlogic amlogic 120 11月 8 21:44 debug.sh
-rwxrwxr-x 1 amlogic amlogic 41 11月 15 16:49 shift.sh
在当前目录查找所有的sh文件 并添加执行权限
find命令使用一对花括号{}代表文件名
!注意该命令结尾的;。必须对分号进行转义,否则shell会将其视为find命 令的结束,而非chown命令的结束。
- 下列命令可以将10天前的 .txt文件复制到OLD目录中
$ find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;
让find跳过特定的目录
- 当前目录所有非.py 结尾文件
$ find ! -name '*.py'
$ find . 'for_fun/' -prune -o -type f -print
amlogic@amlogic-ThinkCentre-M930t-N000:~/coco$
"for_fun/" –prune是命令中负责进行修剪的部分,它指明了for_fun目录应该被排除在外。 -type f –print描述了要执行的操作
xargs
xargs命令从stdin处读取一系列参数,然后使用这些参数来执行指定命令。它能将单行或 多行输入文本转换成其他格式,例如单行变多行或是多行变单行
在当前目录下的sh文件中搜索bin字符
$ ls *.sh | xargs grep bin
coco.sh:#!/bin/bash
coco.sh:/usr/bin/expect <<-EOF &>/dev/null
debug.sh:#!/bin/bash
shift.sh:#!/bin/bash
将多行输入转换成单行输出
$ cat example.txt
1 2 3 4 5 6
7 8 9 10
11 12
$ cat example.txt | xargs
1 2 3 4 5 6 7 8 9 10 11 12
将单行输入转换成多行输出
$ cat example.txt | xargs -n 3
1 2 3
4 5 6
7 8 9
10 11 12
使用X分割并转换成2行输出
$ echo "splitXsplitXsplitXsplit" | xargs -d X -n 2
split split
split split
xargs 与find 结合
$ find . -maxdepth 1 -name '*.sh' -print |xargs grep -L coco
./coco.sh
./shift.sh
./debug.sh
当前目录下查找所有sh中不包含coco字符的文件
读取stdin,为命令传入格式化参数
cecho.sh
$ cat cecho.sh
#!/bin/bash
#文件名: cecho.sh
echo $*'#'
args.txt
$ cat args.txt
arg1
arg2
arg3
- 通过-n 限制传入命令参数的个数
$ cat args.txt | xargs -n 1 ./cecho.sh
arg1#
arg2#
arg3#
# 将参数个数设置为2
$ cat args.txt | xargs -n 2 ./cecho.sh
arg1 arg2#
arg3#
# 一次性提供所有的参数
$ cat args.txt | xargs ./cecho.sh
arg1 arg2 arg3#
- 固定传参的格式
$ cat args.txt | xargs -I {} ./cecho.sh -p {} -l
-p arg1 -l#
-p arg2 -l#
-p arg3 -l#
-I {}指定了替换字符串。为该命令提供的各个参数会通过stdin读取并依次替换掉字符 串{}
组合使用示例
$ find . -type f -name "*.txt" -print | xargs rm -f
删除当前目录下所有.txt文件
$ find . -type f -name "*.sh" -print |xargs -n 1 wc -l
12 ./coco.sh
4 ./shift.sh
11 ./debug.sh
3 ./cecho.sh
计算挡路目录下sh文件的行数
$ cat file.txt
cecho.sh
coco.sh
debug.sh
shift.sh
$ cat file.txt | xargs -I {} cat {}
# 等同于 cat file.txt | ( while read arg; do cat $arg; done )
获取file.txt中所有文件的内容
$ cat coco.py
coco is handsome
$ find . -name '*.py' |xargs -I ^ bash -c "echo -e 'coco\n ^';grep coco ^"
coco
./coco.py
coco is handsome
查找当前目录说有sh文件 并在文件名开头添加 coco\n 后输出 并在该文件中检索包含coco字符的行