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\>
( を使用する場合と同じです"${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