谈谈find,xargs,管道

来源:互联网 发布:sql server exists用法 编辑:程序博客网 时间:2024/06/01 22:22

问题:原意在本文件夹下所有P*.txt文件中用string2替换掉string1,于是输入shell命令:find . -name "P*.txt" | sed -i 's/string1/string2/',发现得不到自己想要的结果。于是简单的了解一下管道的原理以及find,xargs联合使用方式。

1,什么是管道?

指前一个程序的标准输入作为后一个程序的标准输入。

注意:1)管道命令只处理前一个命令正确输出,不处理错误输出

        2)管道命令右边命令,必须能够接收标准输入流命令才行。


find命令会在终端(标准输出)上打印出找到的文件。则sed的标准输入是包含文件名的文本。

~/Desktop/test$:lsP1.txt  P2.txt
在test文件夹下有P1.txt,P2.txt两个文件,每个文件内容为“string1",若find . -name "P*.txt" 的标准输出是在屏幕上打印出

~/Desktop/test$:find . -name "P*.txt"./P2.txt./P1.txt
所以sed处理的是文件名,而不是对文件内的文本进行处理

~/Desktop/test$:find . -name "P*.txt" | sed -n 's/P/S/p'./S2.txt./S1.txt


xargs 则把前一个程序的标准输出转为后一个程序的命令行参数

所以find . -name "P*.txt" 返回./P2.txt,./P1.txt.则find . -name "P*.txt" | xargs sed -n 's/string1/string2/p'中后个一个命令实际是sed -n 's/string1/string2/p' P1.txt P2.txt,即对文件进行处理而不是文件名。

~/Desktop/test$:find . -name "P*.txt" | xargs sed -n 's/string1/string2/p'string2string2
同样我们可以用grep命令

~/Desktop/test$:find . -name "P*.txt" | grep 'P'./P2.txt./P1.txt
比较上下两者的不同。
~/Desktop/test$:find . -name "P*.txt" | xargs grep 'string1'./P2.txt:string1./P1.txt:string1





1 0
原创粉丝点击