cat / Xargs /命令VS for / bash / command

时间:2009-08-15 19:52:13

标签: c bash fork for-loop xargs

Linux 101 Hacks一书的第38页建议:

cat url-list.txt | xargs wget –c

我通常会这样做:

for i in `cat url-list.txt`
   do
      wget -c $i
   done 

除了长度之外,还有一些东西,其中xargs技术在bash中优于旧的for-loop-technique技术吗?

C source code似乎只有一个分叉。相比之下,有多少叉子有bash-combo?请详细说明这个问题。

7 个答案:

答案 0 :(得分:4)

xargs旨在为其分叉的每个进程处理多个输入。在其输入上具有for循环的shell脚本必须为每个输入分叉一个新进程。避免每个进程的开销可以为xargs解决方案带来显着的性能提升。

答案 1 :(得分:4)

来自a UNIX manpage for xargs的基本原理部分。 (有趣的是,这一部分没有出现在{x 1}的OS X BSD版本中,也没有出现在GNU版本中。)

  

xargs的经典应用   实用程序是与   找到实用程序来减少数量   通过简单的使用启动的过程   找到-exec组合。该   xargs实用程序也用于强制执行   需要内存的上限   启动一个过程。有了这个基础   记住,这个POSIX.1-2008的卷   仅选择最小功能   必需的。

在您的跟进中,您会询问其他版本的叉子数量。 Jim already answered this:每次迭代一次。有多少次迭代?提供一个确切的数字是不可能的,但很容易回答一般问题。你的url-list.txt文件中有多少行?

还有其他一些考虑因素。 xargs需要额外注意带有空格或其他禁忌字符的文件名,xargs有一个选项(-exec),将处理分组。所以,不是每个人都喜欢+,也许并不是最适合所有情况。

请参阅以下链接:

答案 2 :(得分:4)

还要考虑:

xargs -I'{}' wget -c '{}' < url-list.txt

但是wget提供了更好的方法:

wget -c -i url-list.txt

关于xargs与循环的考虑,当意义和实现相对“简单”和“清晰”时,我更喜欢xargs,否则,我使用循环。

答案 3 :(得分:4)

xargs还允许你有一个巨大的列表,这对于“for”版本是不可能的,因为shell使用的命令行长度有限。

答案 4 :(得分:2)

而不是GNU / Parallel我更喜欢使用内置并行处理的xargs。添加-P以指示并行执行的货叉数量。如... ...

 seq 1 10 | xargs -n 1 -P 3 echo

将在3个不同的核心上使用3个叉子进行计算。现代GNU Xargs支持这一点。如果使用BSD或Solaris,您必须自己验证。

答案 5 :(得分:1)

根据您的互联网连接,您可能希望使用GNU Parallel http://www.gnu.org/software/parallel/并行运行。

cat url-list.txt | parallel wget -c

答案 6 :(得分:0)

我能想到的一个优点是,如果你有很多文件,它可能会稍快一些,因为你没有从启动新进程那么多的开销。

我不是真正的bash专家,所以可能有其他原因它会更好(或更糟)。