跳至內容

GNU parallel

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
Parallel
開發者GNU計劃
目前版本20220322[1](2022年3月22日,​2年前​(2022-03-22
原始碼庫 編輯維基數據連結
程式語言Perl
作業系統Linux和其他類Unix作業系統
類型實用工具
許可協定GPLv3
網站www.gnu.org/software/parallel/ 編輯維基數據

GNU parallel是用於Linux和其他類Unix作業系統的命令列驅動的實用工具,它允許用戶並列的執行shell指令碼。GNU parallel是Ole Tange用Perl寫的自由軟件。它可在GPLv3條款下獲得[2]。GNU parallel可以在遠端伺服器上執行作業,它使用ssh與遠端機器進行通訊。

用法

最常用的用法是替代shell迴圈,比如將

    for x in $(cat list); do 
        do_something "$x"
    done | process_output

變為如下形式:

    cat list | parallel do_something | process_output

這裏的檔案list包含給do_something的實際參數,而這裏的| process_output可以省略。

使用parallel的指令碼通常比使用pexec的指令碼易讀。

程式parallel的特徵還有:

  • 聚組標準輸出標準錯誤輸出,parallel延期輸出直到所有執行作業完成;
  • 可保持輸出的次序同於輸入的次序;
  • 恰當的處理包含特殊字元的檔名,比如空格、單引號、雙引號、&(ampersand)和UTF-8編碼字元;

作為預設,parallel並列執行作業的數量同於CPU核心數目。

例子

 find . -name "*.foo" | parallel grep bar

上述命令是如下命令的並列等價:

 find . -name "*.foo" -exec grep bar {} +

它在當前目錄及其子目錄中的名字結束於.foo的所有檔案中尋找字串bar的出現。parallel將如期執行除非遇到名字包含換行的檔案。為了避免這個限制可以使用:

 find . -name "*.foo" -print0 | parallel -0 grep bar

上述命令使用空字元來分隔檔名。

 find . -name "*.foo" | parallel -X mv {} /tmp/trash

上述命令使用{}來告知parallel{}替代為實際參數列。

 find . -maxdepth 1 -type f -name "*.ogg" | parallel -X -r cp -v -p {} /home/media

上述命令所做同於:

 cp -v -p *.ogg /home/media

但是,使用find/parallel/cp的前者命令更加有效利用資源,並且在*.ogg展開後對於shell而言太大的情況下不作為錯誤而停止。

參見

參照

  1. ^ Tange, Ole. GNU Parallel 20220322 ('Маріу́поль'). parallel (郵寄清單). 2022-03-22 [2022-03-22]. (原始內容存檔於2022-04-04). 
  2. ^ GNU Parallel. GNU.org. [2021-02-06]. (原始內容存檔於2021-02-01). 

外部連結