从标准输入中读取内容,并将此内容传递给它要协助的命令,并作为协助命令的参数来执行。
brian@local:~$ echo "1.txt 2.txt 3.txt" | xargs ls
1.txt 2.txt 3.txt
将echo的标准输出作为xargs的输入,并将输入传递给协助命令ls作为参数来执行。
我们通过cat命令来查看文件1.txt的内容,比如:
brian@Dmaster:~$ echo 1.txt | cat
1.txt
brian@Dmaster:~$ echo 1.txt | xargs cat
hello world
管道可以实现将前面的标准输出作为后面的“标准输入”,它无法实现将前面的标准输出作为后面的参数执行。xargs可以实现管道无法实现的方式,如果标准输入里面包含空格和换行制表符,它会自动全部替换成空格。
brian@Dmaster:~$ echo "1.txt\n2.txt" | xargs ls
1.txt 2.txt
加入我们处理的文件名本身包含空格那应该怎么处理?比如:
brian@Dmaster:~$ for((i=0;i<3;i++)); do touch "test ${i}.log"; done
brian@Dmaster:~$ find . -name '*.log' -print | xargs rm
rm: test: No such file or directory
rm: 0.log: No such file or directory
rm: test: No such file or directory
rm: 1.log: No such file or directory
rm: test: No such file or directory
rm: 2.log: No such file or directory
我们可以通过-0参数来处理,-0表示了允许将NULL作为分隔符.find 也支持对应的选项以NULL字符作为分隔符的输出。find是通过-print0提供的。通过-0选项不仅处理很多包含空格文件,还可以处理引号,空格和反斜线等。如果我们想指定一个符号作为分割符。可以通过-d来设置。比如:
brian@Dmaster:~$ xargs -d "@"
如果想提示我们要执行的协助命令,可以通过-p来设置。比如:
brian@Dmaster:~$ find . -name "*.log" -print0 | xargs -0 -p rm -f
rm -f ./test0.log ./test1.log ./test2.log?..键入y或者n
#如果想一条一条处理可以通过-n参数设置
brian@Dmaster:~$ find . -name "*.log" -print0 | xargs -0 -p -n 1 rm -f
rm -f ./test0.log?...n
rm -f ./test1.log?...n
rm -f ./test2.log?...n
在linux里面应该是比较重要的shell命令了啊,如果你想衡量一个shell命令的执行时间,可以通过time来衡量。
brian@Dmaster:~$ time ls
china.txt eng.txt japan.txt test0.log test1.log test2.log
real 0m0.004s
user 0m0.001s
sys 0m0.001s