我想創建大圖像列表的拇指。 問題是,看起來雖然read line對於大型列表來說非常慢。我能想到的一個解決方案是創建包含最多500行的文件,然後逐個讀取它們。但是有沒有針對這個問題的智能解決方案?雖然讀取行很慢
while read line; do
if [ -e "$line" ] && [ ! -z "$line" ]; then
...
fi
}
done <<< "$imagesList"
我想創建大圖像列表的拇指。 問題是,看起來雖然read line對於大型列表來說非常慢。我能想到的一個解決方案是創建包含最多500行的文件,然後逐個讀取它們。但是有沒有針對這個問題的智能解決方案?雖然讀取行很慢
while read line; do
if [ -e "$line" ] && [ ! -z "$line" ]; then
...
fi
}
done <<< "$imagesList"
讓我們再試一次:
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 ---
如果'$ imageList'與OP所說的一樣大,這將非常慢,並且可能會超出命令行,這意味着最後的條目將不會被執行。 –
您的問題是,您正在使用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字節。這聽起來很多,但可能是騙人的。文件名可以很長 - 特別是如果你在其中包含目錄路徑。這通常足夠長,以便在您測試時通過,但在您確實需要執行測試時會失敗。和。它默默地失敗。你永遠不知道最後幾個文件名被丟棄。
最好的辦法是用圖像名稱列表創建一個文件,而不是將它們加載到環境變量中。
重載*命令行中的*是什麼? ARG_MAX是傳遞給'exec'的緩衝區的最大長度,如果你可以避免一個子shell,它不應該影響純粹的bash解決方案。如果你確實創建了一個子shell,我認爲'echo |的速度而讀'是相當可疑的,因爲你也有'PIPE_BUF'限制管道的緩衝區大小。 – kojiro
ARG_MAX也是命令行的最大長度 - 一旦命令行被擴展。 shell擴展命令行並將其傳遞給命令。如果'$ imagesList'很大,那麼傳遞給正在執行的命令可能太大了。 PIPE_BUF不是一個限制因素。事實上,在我的系統上,它只有512字節。如果第二個命令沒有準備好,PIPE_BUF用於保存第一個命令的STDOUT到第二個命令的STDIN的數據。我當然可以通過管道傳遞超過512個字節。 –
我不是指'PIPE_BUF'限制了*金額*,只是*速度*。但讓我們忽略這一點。這裏更關鍵的是'ARG_MAX'是shell中通過'exec'調用某些東西時可以放入命令行的最大長度。如果shell正在調用內置函數,比如在循環中,則「ARG_MAX」不適用。就像這裏的情況一樣。 – kojiro
也許使用比bash更適合這些任務的東西? – millimoose
另外,你從哪裏得到'$ imagesList',爲什麼你用'<<<''傳入它?也許你可以將創建該列表的所有東西都管到「xargs」中。 – millimoose
@millimoose imagesList是查找的結果。 – user2783132