簡體   English   中英

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

[英]cat/Xargs/command 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旨在為其分叉的每個進程處理多個輸入。 在其輸入上帶有for循環的shell腳本必須為每個輸入分叉一個新進程。 避免每個進程的開銷可以為xargs解決方案提供顯着的性能增強。

xargs的UNIX聯機幫助頁的基本原理部分。 (有趣的是這一部分中不會出現的OS X BSD版本xargs ,也沒有在GNU版本)。

xargs實用程序的經典應用程序與find實用程序結合使用,以減少通過簡單使用find -exec組合啟動的進程數。 xargs實用程序還用於強制啟動進程所需的內存上限。 考慮到這一基礎,本卷POSIX.1-2008僅選擇了所需的最小功能。

在您的后續行動中,您會詢問其他版本的叉子數量。 吉姆已經回答了這個問題 :每次迭代一次。 有多少次迭代? 提供一個確切的數字是不可能的,但很容易回答一般問題。 你的url-list.txt文件中有多少行?

還有其他一些考慮因素。 xargs需要額外注意帶有空格或其他-exec字符的文件名, -exec有一個選項( + ),它將處理分組為批處理。 所以,不是每個人都喜歡xargs ,也許並不是所有情況都是最好的。

看到這些鏈接:

還要考慮:

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

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

wget -c -i url-list.txt

關於xargs與循環的考慮,當意義和實現相對“簡單”和“清晰”時,我更喜歡xargs,否則,我使用循環。

xargs還允許你有一個巨大的列表,這對於“for”版本是不可能的,因為shell使用的命令行長度有限。

而不是GNU / Parallel我更喜歡使用xargs內置的並行處理。 添加-P以指示並行執行的貨叉數量。 如...

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

將在3個不同的核心上使用3個叉子進行計算。 現代GNU Xargs支持這一點。 如果使用BSD或Solaris,您必須自行驗證。

根據您的互聯網連接,您可能希望使用GNU Parallel http://www.gnu.org/software/parallel/並行運行它。

cat url-list.txt | parallel wget -c

我能想到的一個優點是,如果你有很多文件,它可能會稍快一些,因為你沒有從啟動新進程那么多的開銷。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM