什么时候应该优先选择xargs而不是while-read循环?

Cha*_*art 23 linux bash xargs

xargs广泛用于shell脚本; 通常很容易在bash中使用while read -r; do ... donewhile 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,即使我必须编写一个单独的脚本.

  • 我知道这是一个旧线程,但我想我可能会补充说xargs -n1给出与while循环相同的结果 (6认同)

Ole*_*nge 6

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


ony*_*ony 5

"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变量).


ndi*_*dim 5

一些实现xargs也理解一个-P MAX-PROCS允许xargs并行运行多个作业的参数.使用while read循环模拟这将非常困难.

  • 请注意,stdout上的输出不可信任.参见示例:http://www.gnu.org/software/parallel/man.html#differences_between_xargs_and_gnu_parallel(并行grep部分). (3认同)