イメージディレクトリがありますjpg
。すべての水平画像を1つのディレクトリに移動し、すべての垂直画像を別のディレクトリに移動するシェルスクリプトはありますか(またはbash
許可zsh
されていますか?)
答え1
比率の確認など、高さと幅を比較するために特殊演算子でimagemagick
sを使用できます。identify
fx
h/w
for f in ./*.jpg
do
r=$(identify -format '%[fx:(h/w)]' "$f")
if (( r > 1 ))
then
mv "$f" /path/to/portraits
elif (( r < 1 ))
then
mv "$f" /path/to/landscapes
fi
done
# mv ./*.jpg /path/to/squares
これにより、現在のディレクトリに正方形の画像が保持されます。最後の行のコメントを外して、そのディレクトリに移動します。または、水平方向または垂直方向に含めるには、比較演算子の1つをまたは<=
に変更します>=
。
答え2
ImageMagickの使用identify
:
#! /bin/sh
identify -format '%w %h %i\n' -- "$@" 2>/dev/null | \
while read W H FN; do
if [ $W -gt $H ]; then
echo mv -f -- "$FN" /path/to/landscape/
else
echo mv -f -- "$FN" /path/to/portraits/
fi
done
これはmv
ファイル単位で実行されるため、特に効率的ではありませんが、効率を必要としません。
答え3
ユーティリティを使用してfileinfo
画像の幅と高さを取得します。高さが幅より大きい場合、ファイルはportraits/
ディレクトリに移動されます。そうでない場合は、そのlandscape/
ディレクトリに移動します。
for f in ./*jpg
do
if fileinfo "$f" 2>&1 | awk '/w =/{w=$3+0; h=$6+0; if (h>w) exit; else exit 1}'
then
mv "$f" portraits/
else
mv "$f" landscape/
fi
done
このループのファイル名は必要に応じて二重引用符で囲まれているため、スペース、改行、またはその他の難しい文字を含む画像ファイル名にもこのループを使用するのは安全です。
Debianファミリーシステムでは、以下fileinfo
からインストールできます。
apt-get install leptonica-progs
awk コマンドを適切に変更する限り、他の同様のユーティリティを使用できます。
答え4
他の回避策で算術エラーが発生した場合は、この回避策を試してください。
#/bin/zsh
mkdir -p portraits
mkdir -p landscapes
for f in ./*.jpg
do
r=$(identify -format '%[fx:(h/w)]' "$f")
if [[ r < 1.0 ]]
then
echo "Portrait detected."
mv "$f" ./portraits/
elif [[ r > 1.0 ]]
then
echo "Landscape detected."
mv "$f" ./landscapes/
fi
done