猫/ xargs的/指令Vs为/ bash的/命令(cat/Xargs/command VS for

2019-09-23 22:38发布

在第38页的书Linux的101名黑客的建议:

cat url-list.txt | xargs wget –c

我通常做的:

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

有一些事情,莫过于长度,其中xargs的,技术是优于老好for循环 - 技术在bash其他?

添加

在C源代码似乎只有一个岔路口。 相比之下, 多少叉有与bash组合? 请详细说明这个问题。

Answer 1:

从的理论依据部分在UNIX联机帮助页xargs 。 (有趣的是这一部分中不会出现的OS X BSD版本xargs ,也没有在GNU版本)。

该xargs的实用程序的典型应用是与find工具相结合,以减少通过一个简单的使用的find -exec组合的推出进程数。 该xargs的工具也用于强制启动一个进程需要对存储器的上限。 有了这个基础上考虑,本卷POSIX.1-2008只选择所需的最小功能。

在您的随访中,你问另一个版本将会有多少叉有。 吉姆已经回答了这个 :每次迭代之一。 多少次迭代有哪些? 这是不可能给出一个确切的数字,但容易回答一般问题。 在您的网址,LIST.TXT文件多少行呢?

还有其他的一些其他方面的考虑。 xargs需要用空格或其他没有没有字符的文件名额外的照顾,和-exec有一个选项( + ),该集团加工成批次。 所以,不是每个人都喜欢xargs ,也许它不是最好的所有情况。

请参阅以下链接:

  • http://www.sunmanagers.org/pipermail/summaries/2005-March/006255.html
  • http://fahdshariff.blogspot.com/2009/05/find-exec-vs-xargs.html


Answer 2:

也可以考虑:

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

但是wget的提供相同甚至更好的方法:

wget -c -i url-list.txt

关于xargs的与循环的考虑,我宁愿当xargs的含义和实施都比较“简单”和“清除”,否则,我使用的循环。



Answer 3:

xargs的也将让您有一个巨大的名单,因为外壳采用长度有限的命令行,这是不可能的“的”的版本。



Answer 4:

xargs被设计成处理每个进程它叉的多个输入。 用甲壳脚本for循环在其输入必须叉对于每个输入的新方法。 避免了每个进程的开销,可以给一个xargs解决方案显著的性能增强。



Answer 5:

代替的GNU /并行I喜欢使用内置的并行处理xargs的。 添加-P,表示有多少叉并行执行。 作为...

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

将使用对计算3个不同的内核3个叉。 这是由现代GNU xargs的支持。 你将不得不使用,如果BSD或Solaris,以验证自己。



Answer 6:

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

cat url-list.txt | parallel wget -c


Answer 7:

一个优点,我能想到的是,如果你有很多的文件,也可能是稍快,因为你没有启动新的流程尽可能多的开销。

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



文章来源: cat/Xargs/command VS for/bash/command