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

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源代码似乎只有一个fork。 相比之下,有多少叉子有bash-combo? 请详细说明这个问题。

xargs的UNIX手册页的Rationale部分。 (有趣的是,这部分没有出现在OS X的OS X BSD版本中,也没有出现在GNU版本中。)

xargs实用程序的经典应用程序与find实用程序结合使用,可以通过简单使用find -exec组合来减少启动的进程数。 xargs实用程序还用于强制启动进程所需的内存上限。 考虑到这一基础,本卷POSIX.1-2008仅选择了所需的最小function。

在您的后续行动中,您会询问其他版本的叉子数量。 吉姆已经回答了这个问题 :每次迭代一次。 有多少次迭代? 提供一个确切的数字是不可能的,但很容易回答一般问题。 你的url-list.txt文件中有多少行?

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

看到这些链接:

还要考虑:

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

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

 wget -c -i url-list.txt 

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

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

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

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

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

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

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

 cat url-list.txt | parallel wget -c 

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

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