簡體   English   中英

bash:./script.sh:參數列表太長

[英]bash: ./script.sh: Argument list too long

我有下面的腳本,可以在帶有./checkres.sh *甚至* .jpg的圖像目錄中使用該腳本,但是該腳本僅在文件數量少(少於100個左右)時起作用。 除此之外,它還會因錯誤“參數列表過長”而停止,並且我有100,000個要處理的圖像。

我在網上瀏覽了好幾個小時,嘗試了幾十種不同的更改,使用了一段時間而不是for循環以及對變量的各種其他更改,但似乎沒有任何效果。

當我不熟悉bash腳本並且用盡了所有想法時,誰能幫助解決這個謎。

#!/bin/bash
for img in "$@"
do

export height=`identify -format %h "$img"`
export width=`identify -format %w "$img"`
let ratio=$width/$height

echo Image "$img" = [ $width x $height ] = $ratio

if [ $ratio == 0 ]
then
    echo Portrait 0
    convert "$img" -geometry 600x800 -format jpeg -quality 80 "$img"
else
    echo Landscape 1
    convert "$img" -geometry 800x600 -format jpeg -quality 80 "$img"
fi

您無需更改腳本的任何內容。 只需更改調用方式即可:

find . -maxdepth 1 -name '*.jpg' -exec ./checkres.sh '{}' +

這將在每次調用時僅放入盡可能多的文件名,並在必要時多次運行腳本。


實際上-除非您更改調用約定,否則您無法通過更改腳本解決此錯誤,因為問題是在shell嘗試啟動腳本時發生的!

但是,還有另一種解決方法-您可以將其定義為Shell函數(在~/.bashrc或類似文件中),而不是將其定義為外部腳本,這意味着它不需要作為外部命令啟動,表示相關的操作系統限制不適用。

checkres() {
  for img; do
    ...
  done
}
checkres *.jpg

...完全在shell中執行,消除了對命令行長度的任何限制,這些限制可以在執行期間傳遞給外部命令。

如果要使用目錄參數:

for img in "$1"/*; do

以這種方式正確報價將確保您的代碼可以處理包含空格的目錄名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM