6

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 技术?

添加

C 源代码似乎只有一个 fork 。相比之下,bash-combo 有多少个分叉?请详细说明问题。

4

7 回答 7

4

xargs旨在为它派生的每个进程处理多个输入。带有for循环输入的 shell 脚本必须为每个输入创建一个新进程。避免每个进程的开销可以xargs显着提高解决方案的性能。

于 2009-08-15T19:59:25.823 回答
4

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

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

在您的后续行动中,您询问其他版本将有多少个分叉。Jim 已经回答了这个问题:每次迭代一个。有多少次迭代?不可能给出确切的数字,但很容易回答一般问题。您的 url-list.txt 文件中有多少行?

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

请参阅以下链接:

于 2009-08-15T21:01:40.020 回答
4

还要考虑:

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

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

wget -c -i url-list.txt

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

于 2009-08-15T21:51:37.093 回答
4

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

于 2009-08-15T23:35:19.133 回答
2

而不是 GNU/Parallel,我更喜欢使用 xargs 内置的并行处理。添加 -P 以指示要并行执行多少个分叉。如...

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

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

于 2011-06-14T15:03:30.197 回答
1

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

cat url-list.txt | parallel wget -c
于 2010-06-10T18:15:28.827 回答
0

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

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

于 2009-08-15T19:54:54.960 回答