Você pode usar imagemagick do identify com o operador fx especial para comparar a altura e a largura. %código%. Se for true, será gerado h>w , se falso, será emitido 1 :
for f in ./*.jpg
do
r=$(identify -format '%[fx:(h>w)]' "$f")
if [[ r -eq 1 ]]
then
mv "$f" /path/to/portraits
else
mv "$f" /path/to/landscapes
fi
done
Com 0 você pode usar o qualificador zsh string (para selecionar apenas os arquivos para os quais o código entre aspas retorna e ) e fazer algo como:
mv ./*.jpg(.e_'identify -format "%[fx:(h>w)]" $REPLY | grep 0 >/dev/null'_) /path/to/landscapes
mv ./*.jpg /path/to/portraits
para que o primeiro comando mova todas as imagens de paisagem para true e o segundo mova as imagens restantes para /path/to/landscapes .
As soluções acima tratarão imagens quadradas como paisagens e as moverão para o respectivo diretório. Você poderia introduzir uma segunda condição se quisesse movê-las para seu próprio diretório:
mv ./*.jpg(.e_'identify -format "%[fx:(h<w)]" $REPLY | grep 1 >/dev/null'_) /path/to/landscapes
mv ./*.jpg(.e_'identify -format "%[fx:(h>w)]" $REPLY | grep 1 >/dev/null'_) /path/to/portraits
mv ./*.jpg /path/to/squares
ou você pode usar uma condição diferente (por exemplo, verificar /path/to/portraits ratio) para separar as imagens quadradas do restante e deixá-las no diretório atual:
for f in ./*.jpg
do
r=$(identify -format '%[fx:(h/w)]' "$f")
if [[ r -gt 1 ]]
then
mv "$f" /path/to/portraits
elif [[ r -lt 1 ]]
then
mv "$f" /path/to/landscapes
fi
done