郑州网站建设修改网络营销推广seo
目录
问题引入
find和grep的基本区别
xargs命令
Linux命令的标准输入 vs 命令行参数
举例总结
问题引入
在自己做项目的过程中,想使用linux命令统计下一个目录下html文件的数量,在思考应该使用grep还是find去配合wc指令统计文件数量,后来尝试了一下,发现都是可以的。
[zebra@VM-8-12-centos input]$ ls -Rl | grep -E '*.html' | wc -l
8429
[zebra@VM-8-12-centos input]$ find ./ -name '*.html' | wc -l
8429
虽然成功解决了问题,但是我不是很理解两者的区别,于是深入研究了一下。
find和grep的基本区别
- find搜索的是文件(搜索结果是包括路径的文件名,所以后续可以直接根据文件名操作文件),搜索的匹配条件是文件
- grep搜索的是字符串,搜索的匹配条件是行
- find类似windows下的搜索文件功能
- grep类似windows下的Ctrl+f查找字符串的功能
这也就解释了为什么用grep的时候,需要先ls -Rl,因为grep搜索的匹配条件是行,所以需要先把一条条文件信息列出来,把ls的结果通过管道|传给grep去搜索。
后来我发现find结合xargs可以实现查找目录下文件内容行数的功能,就想知道xargs的作用,以及它和管道|之间的区别和联系
find ./ -name '*.html' | xargs wc -l
...123335 total
xargs命令
xargs命令的作用,就是将标准输入转为命令行参数。基本使用方式如下:
指令A | xargs 指令B
将指令A的标准输出通过管道|传递给xargs,管道传递过来的是标准输入,xargs接收到标准输入后,把标准输入转换成命令行参数,交给指令B去执行。可是这有什么用呢?——接着往下看
Linux命令的标准输入 vs 命令行参数
我们需要知道Linux命令的标准输入与命令行参数的概念
linux命令可以从两个地方读取要处理的内容,一个是通过命令行参数,一个是标准输入。有些命既能读取标准输入,又能读取命令行参数(命令行参数优先);但是有些指令只能读取命令行参数。
而管道|就是将前面的标准输出转换成后一条指令的标准输入,但是后一条指令不一定能够读取标准输入,例如 kill , rm 这些程序如果命令行参数中没有指定要处理的内容则不会从标准输入中读取
xargs就可以将前一条指令的标准输出的字符串,根据空格分割成命令行参数,并以命令行参数的形式交给后一条指令,从而使得一些不能从标准输入里面读取内容的指令可以做到从管道中读取命令行参数。
举例总结
ls -Rl | grep -E '*.html' | wc -l:查找当前目录下html文件的个数
ls列出来的是文件的基本属性信息,这些字符串通过管道传递给grep指令,grep在文本中查找行中以html结尾的(-E表示使用正则匹配),然后交给wc统计行数,行数就是html文件的个数。
find ./ -name '*.html' | wc -l:查找当前目录下html文件的个数
find查找出来的是一行行文件名(包括路径),|只能将这些文件名以字符串的形式作为下一条命令的标准输入,所以wc得到的是一个个字符串,查找行数就是html文件的个数。
find ./ -name '*.html' | xargs wc -l:查找html文件里面的代码行数
xargs指令可以将前一条指令通过|传递过来的字符串,根据空格分割成命令行参数,并交给后一条指令,wc属于既能通过命令行参数读取,又能通过标准输入读取的指令,优先读取命令行参数,于是就相当于执行 wc -l 文件路径+文件名,这样就会读取文件中的内容,统计文件的行数。
本文只是介绍了xargs的基本功能,实际上xargs还有很多实用的选项,比如:
-d:可以更改xargs分割参数的分隔符(默认是按空格分割)
-p:打印出要执行的命令,询问用户是否要执行
-t:则是打印出最终要执行的命令,然后直接执行,不需要用户确认。
-L:如果标准输入包含多行,-L参数指定多少行作为一个命令行参数。
-I:指定参数的位置
......
具体大家可以去问那个男人(滑稽)(man xargs)