我有一个图像目录jpg
。是否有一个 shell 脚本(bash
或zsh
可以接受)将所有横向图像移动到一个目录中,并将所有纵向图像移动到另一个目录中?
答案1
您可以将imagemagick
sidentify
与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
这会将方形图像保留在当前目录中。取消注释最后一行以将它们移动到自己的目录。或者,如果您想将它们包含在横向或纵向中,请将比较运算符之一更改为<=
或>=
。
答案2
使用identify
ImageMagick:
#! /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