用于分离和移动横向和纵向图像的 Shell 脚本

用于分离和移动横向和纵向图像的 Shell 脚本

我有一个图像目录jpg。是否有一个 shell 脚本(bashzsh可以接受)将所有横向图像移动到一个目录中,并将所有纵向图像移动到另一个目录中?

答案1

您可以将imagemagicksidentifyfx特殊运算符一起使用来比较高度和宽度,例如检查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

使用identifyImageMagick:

#! /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

相关内容