shell脚本(2)命令之乐

2019-05-15  本文已影响0人  盖小聂
1、cat拼接

cat绝对不会修改你的文件,他只会根据用户提供选项在stdout中生成一个修改过的输出而已。

拼接多个文件的内容
cat file1 file2 file3 ……
参数 描述
-s 合并相邻的空白行为一个空白行
-t 将制表符Tab显示成^I
-n 显示行号,包含空白行
-b 显示行号,不包含空白行
2、find

打印出目录名下的所有文件名

find 目录名
参数 描述
-print 使用‘\n’对输出的文件名作为分隔
-print0 使用‘\0’对输出的文件名作为分隔,当文件名中包含换行符的时候这个参数就有用武之地了
-name 查找指定名字的文件,可以模糊匹配
-iname 查找指定名字的文件,忽略大小写
-o 可以用-o组合多个搜索条件
-path 匹配路径,将文件路径作为一个整体匹配
-regex 通过正则表达式匹配
! 否定参数
maxdepth/mindepth 基于目录深度的搜索,这个参数宜作为第三个出现,如果作为第四个或者更靠后的位置出现可能会存在性能问题
-type 根据文件类型搜索,-d目录,-f普通文件
-atime/mtime/ctime 最近一次访问时间/最近一次内容修改时间/最近一次文件权限变更时间,linux文件没有文件创建时间的概念,单位是天
-amin/mmin/cmin 单位为分钟
-newer 可以指定一个比较时间戳的参考文件,找出比参考文件更新的所有文件,指定的内容修改更新的所有文件
-size 基于文件大小的搜索
-delete 删除匹配的文件
-perm/user 基于文件权限和所有权的匹配
-exec 利用find执行命令或动作。-exec后面可以跟任何命令。{}是一个与-exec搭配使用的特殊字符串,对于每一个匹配的文件{}会被替换成相应的文件名。但是exec后面只能跟一个命令不能跟多个命令,但是可以通过将多个命令写在一个脚本当中然后执行这个脚本来解决。
-prune 让find跳转到特定的目录

举几个🌰:

//用-o组合多个搜索条件
find . -name "*.html" -o -name "*.py"

//找出当前目录下所有非.txt文件
find . ! -name "*.txt"

//找出文件大于2k的文件
find . -type f -size 2k

//删除匹配的文件
find . -name "A.*" -delete

//查找权限为644的文件
find . -type f -perm 644
//查找用户jesse的文件
find . -type f -user jesse

//拼接当前目录下所有的txt文件写入all_txt_files文件中
//all_txt_files.txt文件不要放在当前目录否则会出现死循环
find . -type f -name "*.txt" -exec cat {} \;>../all_txt_files.txt

//打印不包括在.git目录下的所有文件
find . ( -name ".git" -prune ) -o ( -type f -print )
3、xargs

我们可以用管道将一个命令的输出作为另一个命令的输入,但是有些命令只能以命令行参数的形式接收数据,比如.sh脚本文件的参数等等。这种情况下没办法用管道来提供那些只能通过命令行参数才能提供的数据。xargs擅长将标准输入数据转化为命令行参数。
xargs应该紧跟在管道操作之后

//xargs将多行文本转化为单行
cat example.txt | xargs
参数 描述
-n 将多行文本转化为单行,每行包含n个字符串,以空格作为分隔符
-I 有啥用?
cecho.sh的内容:
echo $*'#' //将参数打印出来最后加一个"#"号结束

example.txt的内容:
arg1
arg2
arg3

//将多行为本转化为单行,每行3个字符串,以空格做为分隔符
cat example.txt | xargs -n 3 ./cecho.sh 
输出结果:arg1 arg2 arg3#

//{}会被example.txt中的内容一一替换,
//但是在这种情况下似乎-n参数就失效了,不论-n参数的值设成多少始终是输出三行结果
cat example.txt | xargs -I {} ./cecho.sh -p {} -l
输出的结果:
-p arg1 -l
-p arg2 -l
-p arg3 -l

find和xargs的组合使用
只要我们将find的输出作为xargs的输入,就必须将-print0与find结合使用,以字符串null('\0')来分隔输出。

//删除所有的.txt文件
find . -type f -name "*.txt" -print0 | xargs -0 rm -f
//统计当前目录下所有.c文件的行数
find . -type f -name "*.c" -print0 | xargs -0 wc -l
4、md5

单项散列算法,无法逆向推出原始数据,用于验证数据的完整性或者为特定的数据生成唯一的秘钥

md5 filename //计算文件的md5值
5、uniq

操作的必须是要排过序的数据。uniq输出所有的行,重复行只输出一遍。

参数 描述
-u 只输出哪些没有重复的行
-d 只输出重复行
-c 统计行出现的次数
补充:

1、mv命令重命名文件
2、在grep中,^标记单词的开始,$标记单词的结束

上一篇下一篇

猜你喜欢

热点阅读