2016-11-11 80 views
1

在需要限制大小的子文件夾中有圖像(720最大寬度或1100最大高度)。他們的文件名必須保留。開始於:Bash convert resize遞歸保存文件名

for img in *.jpg; do filename=${img%.*}; convert -resize 720x1100\> "$filename.jpg" "$filename.jpg"; done 

它在每個目錄內工作,但有很多子文件夾與這些圖像。嘗試find . -iname "*.jpg" -exec cat {},但它沒有按預期創建一個列表。

這也沒有工作:

grep *.jpg | while read line ; do `for img in *.jpg; do filename=${img%.jpg}; convert -resize 720x1100\> "$filename.jpg" "$filename.jpg"`; done 

也不是這:

find . -iname '*jpg' -print0 | while IFS= read -r -d $'\0' line; do convert -resize 720x1100\> $line; done 

這使我的錯誤消息 「轉換:沒有圖像定義。」然後:

find . -iname '*.jpg' -print0 | xargs -0 -I{} convert -resize 720x1100\> {} 

給我同樣的錯誤信息。

+0

如果您使用的是Bash 4,那麼您可以輕鬆修改您的第一次嘗試來處理目錄樹中的所有jpg文件:'shopt -s globstar;對於img in **/*。jpg;做...; done'。 – pjh

+0

也試過'找。 -type d -exec bash -c'cd「$ 0」||出口; shopt -s nullglob; f =(* .jpg); (($ {#f [@]}))&& echo convert -resize 640x1100 \>「$ {f [@]}」「$ {f [@]}」'{} \;'基於http:// stackoverflow.com/questions/23311384/execute-imagemagick-convert-in-subfolders-with-bash-script – motorbaby

+0

我升級Bash並得到轉換:無法打開圖像**/*。jpg'':沒有這樣的文件或目錄。 – motorbaby

回答

3

看來你正在尋找簡單:

find /path/to/dir -name '*.jpg' -exec mogrify -resize 720x1100\> {} \; 

在你的例子,你帶了.jpg擴展,然後你加回來。根本不需要剝離,而且這可以簡化很多事情。 另外,convert filename filenamemogrify filename確實相同。 mogrify是ImageMagick的一部分,它可以在原地修改文件,覆蓋原始文件。 convert可用於創建新文件,保留原件。

+0

謝謝。過去我一直與mogrify運氣不佳;因此,猶豫使用它。但是,這很好,而且正是我需要的。謝謝! – motorbaby

0

由於所有子目錄的兩個層次下來,發現這工作:

for img in **/*/*.jpg ; do filename=${img%.*}; convert -resize 720x1100\> "$filename.jpg" "$filename.jpg"; done 

感謝@pjh你爲我開始。這也工作:

shopt -s globstar ; for img in */*/*.jpg ; do filename=${img%.*}; convert -resize 720x1100\> "$filename.jpg" "$filename.jpg"; done 

但我得到錯誤信息「-bash:禁用了javascript:globstar:無效的shell選項名」,但所有非指定用保存的文件名調整較大的圖像。

+0

然而,真正的問題是如何搜索各級目錄。 – motorbaby