2014-06-16 179 views
1

我有一個for循環將遍歷目錄中的所有文件。我想在每個文件上運行一個進程(在本例中爲echo文件名和sleep 5)。不過,我希望能夠一次運行這5個文件(在&的背景下)。問題是我無法弄清楚如何在while循環中迭代$f,這樣我就不會同時處理同一個文件五次而不是五個不同的文件。Bash forke循環與while循環控制

#!/bin/bash 

maxjobs=5 

for f in `ls /home/user/` 
do 
jobsrunning=0 
    while [ $jobsrunning -lt $maxjobs ] 
    do 
    echo "Converting file"$f 
    sleep 5 & #wait for 5 seconds 
    jobsrunning=$((jobsrunning + 1)) 
    echo $jobsrunning 
    done 
wait 
done 
+0

你永遠不會將'jobsrunning'重置爲0.但是存在一個更好的解決方案來將文件「提供」給進程。在這裏搜索'find print0 xargs'。不幸的是,最後一個詞可能是「多個」,「工作」,「否」或其他幾個。 – shellter

+2

請[不要分析'ls'](http://mywiki.wooledge.org/ParsingLs) – kojiro

+2

不需要'ls ...'subshel​​l with for。 「for f in/home/user/*」就足夠了 - 與ls不同的是名稱將完全合格,因此不是替代品。可能在你的情況下更可取,因爲對這些文件的操作需要知道隱含的「/ home/user」位置作爲你當前的解決方案需要的「 –

回答

3

你真的只需要重置jobsrunning,我不認爲你需要內部循環。這只是一個條件。

#!/bin/bash 

maxjobs=5 
jobsrunning=0 
for f in /home/user/*; do 
    if ((jobsrunning >= maxjobs)); then 
     wait 
     jobsrunning=0 
    fi 
    echo "converting" 
    sleep 5 & # wait for how many seconds? 
    ((jobsrunning++)) 
    echo "$jobsrunning" 
done 
wait 

這就是說,這聽起來像是一份parallel的工作。

+0

這並不奏效,'jobsrunning'需要在if語句之前定義。嘗試運行時遇到大量錯誤。 – crysis405

+0

@ crysis405好吧,顯式可能會更好,但在shell算術上下文中未定義的名稱評估爲'0',所以這應該可以正常工作。但是,如果您只是在原始代碼中使用'[]',那麼是的,您需要定義它。儘管爲什麼不切換到現代算術表達式呢? – kojiro

+0

我在Ubuntu 12.04,我似乎無法得到這個工作。我需要更新一些東西嗎? – crysis405