我使用以下腳本來轉換所有jpg
圖像png
:
# absolute path to image folder
FOLDER="/home/*/public_html/"
# max width
WIDTH=1280
# max height
HEIGHT=720
#resize png or jpg to either height or width, keeps proportions using imagemagick
find ${FOLDER} -type f \( -iname \*.jpg -o -iname \*.png \) -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;
但今天我跑步時感到震驚
ls -l
發現所有照片都被修改了,數據也被改變了,無論大與否
Oct 28 11:18 /home/photos/20210321/T161631305496ece25372fc18a9239da7911ac7c0dd056 (2).jpg
所以我正在考慮使用一個if
條件首先檢查圖像的路徑,然後如果 WIDTH 大於 1280px 則運行convert
。否則什麼都不做。
更新2
我建立了這個腳本
#!/bin/bash
for i in /root/d/*.jpg; do
read -r w h <<< $(identify -format "%w %h" "$i")
if [ $w -gt 1280 ]; then
FOLDER="$i"
WIDTH=1280
HEIGHT=720
find ${FOLDER} -type f \( -iname \*.jpg -o -iname \*.png \) -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;
fi
done
所以我看得find
更清楚了for
。
for
沒有搜尋所有資料夾和子資料夾。
更新3
WIDTH=1280
HEIGHT=720
find /home/sen/tes/ -type f \( -iname \*.jpg -o -iname \*.png \) | while read img; do \
anytopnm "$img" | pamfile | \
perl -ane 'exit 1 if $F[3]>1280' || convert "$img" -verbose -resize "${WIDTH}x${HEIGHT}>" "$img"; \
done
效果很好,但我明白了
jpegtopnm: WRITING PPM FILE
當沒有影像時> 1280
答案1
命令的主要問題convert
是參數$WIDTHx$HEIGHT\>
嘗試擴展名為 的變數$WIDTHx
。由於此變數不存在,因此使用的參數-resize
將是任何參數$HEIGHT\>
(與 using 相同"${HEIGHT}x$HEIGHT>"
)。您可以使用 來修復此問題-resize "${WIDTH}x$HEIGHT>"
。這是您的兩個命令中的問題find
。
要縮小太大的圖像,您可以使用類似的東西
#!/bin/sh
w=1280
h=720
find /home/*/public_html -type f \( -iname '*.jpg' -o -name '*.png' \) \
-exec convert -resize "${w}x${h}>" {} \;
就我個人而言,我只會從最新的備份中恢復影像,因為像這樣上下縮放影像必然會大大降低其品質。
測試時,先在較小的影像副本上執行,然後再讓腳本在整個影像集合上運行。還要確保您的備份按預期運行。
答案2
很抱歉我不清楚,我找到並建立了我的最終腳本,並希望用聰明的一個來糾正 Q 的標題
腳本搜尋檔案jpg
或png
如果找到則檢查寬度如果發現大於 1280 將轉換
#!/bin/bash
find /home/sen/tes/ -type f \( -iname \*.jpg -o -iname \*.png \) | while read i; do \
read -r w h <<<$(identify -format "%w %h" "$i")
if [ $w ]; then
if [ $w -gt 1280 ]; then
FOLDER="$i"
WIDTH=1280
HEIGHT=720
find ${FOLDER} -type f \( -iname \*.jpg -o -iname \*.png \) -exec convert \{} -verbose -resize ${WIDTH}x${HEIGHT}\> \{} \;
fi
fi
done