【问题标题】:cat/Xargs/command VS for/bash/commandcat/Xargs/command VS for/bash/command
【发布时间】:2010-11-19 22:36:03
【问题描述】:

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 source code 似乎只有一个分叉。相比之下,bash-combo 有多少个分叉?请详细说明问题。

【问题讨论】:

    标签: c bash fork for-loop xargs


    【解决方案1】:

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

    【讨论】:

    • 你的意思是 xargs 只是为了性能?难以置信。一定有别的东西。
    • 打字时间也短一些。并且有一个大标签,上面写着“不要惊慌”
    • 说正经的:进程创建并不便宜。使用今天的快速处理器,它并不明显,但可以追溯到 10 到 15 年,您就会明白为什么 xargs 是首选解决方案。
    • "只为了性能?"不要忘记xargs 还可以处理大量无法执行的命令的参数。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      cat url-list.txt | parallel wget -c
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这是我所关注的唯一令人信服的原因之一,假设它的信息正确且没有过时。
        【解决方案5】:

        同时考虑:

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

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

        wget -c -i url-list.txt
        

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

        【讨论】:

          【解决方案6】:

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

          xargs 的经典应用 实用程序与 找到实用程序以减少数量 通过简单化使用启动的流程 find -exec 组合。这 xargs 实用程序也用于强制执行 所需的内存上限 启动一个进程。有了这个基础 请注意,这卷 POSIX.1-2008 只选择了最小的特征 必填。

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

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

          查看这些链接:

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-11-01
              • 2020-04-02
              • 2019-07-07
              • 2012-12-18
              • 1970-01-01
              • 2014-07-01
              • 2018-07-18
              • 2010-12-09
              相关资源
              最近更新 更多