2014-02-11 37 views
1

我試圖運行BASH函數的10個實例同時GNU並行GNU平行嵌套for循環和多個命令

從圖像bash的功能下載瓷磚並且將它們縫合在一起 - 第一單排,然後每個列 - 到單個圖像文件。

function DOWNLOAD_PAGE { 
for PAGE in {0041..0100} 
do 
       for COLUMN in {0..1} 
         do 
           for ROW in {0..2} 
           do wget -O "$PAGE"_"$COLUMN"_"$ROW".jpg "http://www.webb$PAGE$COLUMN$ROW" 
         done 
       convert "$PAGE"_"$COLUMN"_*.jpg -append "$PAGE"__"$COLUMN".jpg 
       done 
       convert "$PAGE"__*.jpg +append "$PAGE"_done.jpg 
     done 
} 

遺憾的是,顯然obviuous解決方案 - 第一個是

export -f DOWNLOAD_PAGE 
parallel -j10 DOWNLOAD_PAGE 

不起作用。

有沒有辦法使用GNU並行?

回答

1

你的函數的部分可以被並列化,而其他的不可以:例如,在下載圖像之前,您無法追加圖像。

function DOWNLOAD_PAGE { 
    export PAGE=$1 
    for COLUMN in {0..1} 
    do 
     parallel wget -O "$PAGE"_"$COLUMN"_{}.jpg "http://www.webb$PAGE$COLUMN{}" ::: {0..2} 
     convert "$PAGE"_"$COLUMN"_*.jpg -append "$PAGE"__"$COLUMN".jpg 
    done 
    convert "$PAGE"__*.jpg +append "$PAGE"_done.jpg 
} 

export -f DOWNLOAD_PAGE 
parallel -j10 DOWNLOAD_PAGE ::: {0041..0100} 

更並行的版本(但更難讀):

function DOWNLOAD_PAGE { 
    export PAGE=$1 
    parallel -I // --arg-sep /// parallel wget -O "$PAGE"_//_{}.jpg "http://www.webb$PAGE//{}"\; convert "$PAGE"_"//"_\*.jpg -append "$PAGE"__"//".jpg ::: {0..2} /// {0..1} 
    convert "$PAGE"__*.jpg +append "$PAGE"_done.jpg 
} 

export -f DOWNLOAD_PAGE 
parallel -j10 DOWNLOAD_PAGE ::: {0041..0100} 

你什麼GNU並行確實是有點誤導的認識。考慮參考教程http://www.gnu.org/software/parallel/parallel_tutorial.html,然後嘗試瞭解示例的工作方式:n1_argument_appending「> http://www.gnu.org/software/parallel/man.html#example__working_as_xargs_ n1 _argument_appending