管道和xargs 在linux命令中经常使用,但大部分不太了解其中的区别。
看一个简单例子:
-
使用管道修改.txt结尾文件的权限, 返回缺少参数的错误提示。image.png
-
使用xargs 则返回成功。 image.png
参数和标准输入的不同
- 标准输入即终端输入的数据流,当使用cat命令时后面不加参数则需要用户手动输入。实际上有些linux命令是没有标准输入的,例如ls,chmod等等。参数则很好理解,命令后面附加条件数据。
- 管道传递的是标准输入,而xargs传递的才是参数。管道后面加xargs表明把标准输入转化为参数传递给下一个命令。
xargs 深入了解
选项解释
-0 :当sdtin含有特殊字元时候,将其当成一般字符,想/'空格等
$ echo "/ / "|xargs echo
/ /
$ echo "/ / "|xargs -0 echo
/ /
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
$ cat 1.txt |xargs -n 2 echo
aaa bbb
ccc ddd
a b
-p 操作具有可交互性,每次执行comand都交互式提示用户选择,当每次执行一个argument的时候询问一次用户
$ cat 1.txt |xargs -p echo
echo aaa bbb ccc ddd a b ?...y
aaa bbb ccc ddd a b
$ cat 1.txt |xargs -p echo
echo aaa bbb ccc ddd a b ?...n
-t 表示先打印命令,然后再执行。
$ cat 1.txt |xargs -t echo
echo aaa bbb ccc ddd a b
aaa bbb ccc ddd a b
-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给{},可以用{}代替。
$ ls
1.txt 2.txt 3.txt log.xml
$ ls *.txt |xargs -t -i mv {} {}.bak
mv 1.txt 1.txt.bak
mv 2.txt 2.txt.bak
mv 3.txt 3.txt.bak
$ ls
1.txt.bak 2.txt.bak 3.txt.bak log.xml
注意,-I 必须指定替换字符 -i 是否指定替换字符-可选
find . | xargs -I {} cp {} $D_PATH
与
find . | xargs -i cp {} $D_PATH