水平画像と垂直画像を分離して移動するシェルスクリプト

水平画像と垂直画像を分離して移動するシェルスクリプト

イメージディレクトリがありますjpg。すべての水平画像を1つのディレクトリに移動し、すべての垂直画像を別のディレクトリに移動するシェルスクリプトはありますか(またはbash許可zshされていますか?)

答え1

比率の確認など、高さと幅を比較するために特殊演算子でimagemagicksを使用できます。identifyfxh/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

関連情報