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