xargs 和 管道 一些理解

管道和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

你可能感兴趣的:(xargs 和 管道 一些理解)