xargs
广泛用于shell脚本; 通常很容易在bash中使用while read -r; do ... done
或while read -ar; do ... done
循环重构这些用法.
什么时候应该xargs
首选,何时应该优先使用while-read循环?
pax*_*blo 26
while
循环的东西是它们倾向于一次处理一个项目,通常是在不必要时.这是xargs
有优势的地方 - 它可以批处理参数以允许一个命令处理大量项目.
例如,while循环:
pax> echo '1
2
3
4
5' | while read -r; do echo $REPLY; done
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
和相应的xargs
:
pax> echo '1
2
3
4
5' | xargs echo
1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)
在这里你可以看到这些线是与它们while
一起一个一个地处理的xargs
.换句话说,前者等同于echo 1 ; echo 2 ; echo 3 ; echo 4 ; echo 5
后者等同于echo 1 2 3 4 5
(五个过程而不是一个过程).这在处理数千或数万行时确实有所不同,因为创建流程需要时间.
当使用可以接受多个参数的命令时,它最有利,因为它减少了启动的单个进程的数量,使事情变得更快.
当我处理小文件或者在每个项目上运行的命令都很复杂时(我懒得写一个单独的脚本来提供xargs
),我将使用该while
变体.
在我对性能(大文件)感兴趣的地方,我会使用xargs
,即使我必须编写一个单独的脚本.
GNU Parallel http://www.gnu.org/software/parallel/具有xargs
(使用-m)和while-read
使用换行符作为分隔符和一些新功能(例如输出分组,在远程计算机上并行运行作业)的优点和上下文替换).
如果你安装了GNU Parallel,我看不到你会使用的单一情况xargs
.我将使用的唯一情况是,read-while
如果要执行的块太大,放入一行就变得不可读(例如,如果它包含if语句或类似)并且您拒绝创建bash函数.
对于所有小脚本,我实际上发现它使用GNU Parallel更具可读性.paxdiablo的例子:
echo '1
2
3
4
5' | parallel -m echo
Run Code Online (Sandbox Code Playgroud)
使用GNU Parallel将WAV文件转换为MP3:
find sounddir -type f -name '*.wav' | parallel -j+0 lame {} -o {.}.mp3
Run Code Online (Sandbox Code Playgroud)
观看GNU Parallel的介绍视频:http://www.youtube.com/watch?v = OpaiGYxkSuQ
"xargs"有选项"-n max-args",我想这将允许一次调用几个参数的命令(对"grep","rm"和更多这样的程序很有用)试试man-page的例子:
cut -d: -f1 < /etc/passwd | sort | xargs -n 5 echo
Run Code Online (Sandbox Code Playgroud)
并且你会看到它"回应" - 每行5个用户
PS并且不要忘记"xargs" - 是程序(如子shell).因此无法以简单的方式获取shell脚本的信息(您需要读取"xargs"的输出并以某种方式解释以填充shell/env变量).
一些实现xargs
也理解一个-P MAX-PROCS
允许xargs
并行运行多个作业的参数.使用while read
循环模拟这将非常困难.