2013-09-24 91 views
0

我想創建大圖像列表的拇指。 問題是,看起來雖然read line對於大型列表來說非常慢。我能想到的一個解決方案是創建包含最多500行的文件,然後逐個讀取它們。但是有沒有針對這個問題的智能解決方案?雖然讀取行很慢

while read line; do 
    if [ -e "$line" ] && [ ! -z "$line" ]; then 
       ... 
    fi 
} 
done <<< "$imagesList" 
+0

也許使用比bash更適合這些任務的東西? – millimoose

+2

另外,你從哪裏得到'$ imagesList',爲什麼你用'<<<''傳入它?也許你可以將創建該列表的所有東西都管到「xargs」中。 – millimoose

+0

@millimoose imagesList是查找的結果。 – user2783132

回答

-1

讓我們再試一次:

echo $imagelist | xargs --delimiter=\ --max-args=1 -i echo "Do something with {}" 

--- 8 <第一個版本--- 8 < ---

嘗試是這樣的:

for IMG in $imageList; do 
    echo "Do something with ${IMG}" 
done 

- - > 8首版---> 8 ---

+1

如果'$ imageList'與OP所說的一樣大,這將非常慢,並且可能會超出命令行,這意味着最後的條目將不會被執行。 –

1

您的問題是,您正在使用HERE字符串通過<<<在這些行中讀取。如果HERE字符串非常大,這將會很慢。

如果$imgageList是一個文件,你可以做一個文件重定向,這將是快了很多:

while read line 
do 
    if [ -e "$line" -a ! -z "$line" ] 
    then 
     ... 
    fi 
done < "$imagesList_file" # Redirect from a file. 

您可能能夠做到這一點:

echo "$imagesList" | while read line 
    do 
    if [ -e "$line" -a ! -z "$line" ] 
    then 
     ... 
    fi 
done 

不過,我會擔心重載命令行。在Linux/Unix系統中,這在/usr/include/sys/syslimits.h/usr/include/syslimits.h中定義。它在我的系統上是1024 * 256或262,144字節。這聽起來很多,但可能是騙人的。文件名可以很長 - 特別是如果你在其中包含目錄路徑。這通常足夠長,以便在您測試時通過,但在您確實需要執行測試時會失敗。和。它默默地失敗。你永遠不知道最後幾個文件名被丟棄。

最好的辦法是用圖像名稱列表創建一個文件,而不是將它們加載到環境變量中。

+0

重載*命令行中的*是什麼? ARG_MAX是傳遞給'exec'的緩衝區的最大長度,如果你可以避免一個子shell,它不應該影響純粹的bash解決方案。如果你確實創建了一個子shell,我認爲'echo |的速度而讀'是相當可疑的,因爲你也有'PIPE_BUF'限制管道的緩衝區大小。 – kojiro

+0

ARG_MAX也是命令行的最大長度 - 一旦命令行被擴展。 shell擴展命令行並將其傳遞給命令。如果'$ imagesList'很大,那麼傳遞給正在執行的命令可能太大了。 PIPE_BUF不是一個限制因素。事實上,在我的系統上,它只有512字節。如果第二個命令沒有準備好,PIPE_BUF用於保存第一個命令的STDOUT到第二個命令的STDIN的數據。我當然可以通過管道傳遞超過512個字節。 –

+0

我不是指'PIPE_BUF'限制了*金額*,只是*速度*。但讓我們忽略這一點。這裏更關鍵的是'ARG_MAX'是shell中通過'exec'調用某些東西時可以放入命令行的最大長度。如果shell正在調用內置函數,比如在循環中,則「ARG_MAX」不適用。就像這裏的情況一樣。 – kojiro