2014-09-19 20 views
1

爲每個文件在目錄程序並行執行我怎麼可以把所有的文件工作,在目錄中使用bash幾個CPU,而無需使用並行命令用於在bash

回答

2
NR_CPUS=3 
format=.jpg 
job_count=0 
for f in *."$format"; do 
    mycommand "$f" & 
    job_count=$((job_count+1)) 
    if [ "$job_count" -eq $NR_CPUS ]; then 
     wait 
     job_count=0 
    fi 
done 
1

您可以生成每個一個單獨的進程文件(這是平行做什麼...更聰明)

for f in *.jpg; do 
    some_program_or_shell_function $f & 
done 
+0

如果你有1000個文件,只有2個cpus,該怎麼辦? – sherif 2014-09-19 12:23:21

+1

1000個進程完全沒有問題。這取決於過程的作用。它需要很多CPU嗎?那麼應該限制它的核心數量。如果它是IO限制的,那麼你不需要限制進程的數量(你應該簡單地測試你是否從並行中受益)。 – Sebastian 2014-09-19 12:25:02

+0

即使在CPU限制作業的情況下,限制進程數量的決定取決於您是否關心*部分*作業儘快完成,或者只是儘快完成*整理*整理。在後一種情況下,更容易產生它們,並讓操作系統擔心在可用內核上安排它們。 – chepner 2014-09-19 12:27:31

1

find命令xargs命令一起經常在這種情況下使用;像這樣:

find . -maxdepth 1 -type f -print0 | xargs -0 -n 1 -P 4 echo 

你需要在你想同步進程(通常是相同的物理內核在您的計算機中CPU密集型任務的數量)和echo用的最大數量,以取代4您想要在這些文件上運行的程序的實際名稱。

選項maxdepth防止find從目錄(如果你想遞歸刪除)遞歸,以及對-print0/-0是那裏在find(通常輸出安全處理分詞,以防止文件名與空間他們)