如何使用命令行查找具有特定像素大小的所有图像并将其移动到新文件夹

如何使用命令行查找具有特定像素大小的所有图像并将其移动到新文件夹

我正在尝试查找所有高度和长度不等于 256 像素的照片,并将它们移动到新文件夹。到目前为止,我能够在终端中编写以下代码,该代码会将符合条件的所有照片的列表输出到终端:

find . -iname "*.jpg" -type f | xargs -I{} identify -format '%w %h %i' {} | awk '$1!=256 || $2!=256'

现在我想将所有这些照片移动到一个新文件夹。我尝试了以下操作:

find . -iname "*.jpg" -type f | xargs -I{} identify -format '%w %h %i' {} | awk '$1<300 || $2<300' -exec mv "{}" ~/path_to_location/ \;

我收到一个错误

没有名为 exec 的文件或目录

并且:

xargs identidy:由信号 13 终止

非常希望得到您的帮助 谢谢

答案1

for在 bash 中,您可以像这样循环执行此操作:

for f in *.jpg
do 
     if [ -f "$f" ] # Check if it is a file
     then
        w=$(identify -format '%w' "$f") # Get width
        h=$(identify -format '%h' "$f") # Get hight
        [[ "$w" -lt 300 || "$h" -lt 300 ]] && # Check if width or hight are less than 300
        echo mv -- "$f" ~/path_to_location/ # Move the file ... "echo" is for simulation only ... remove "echo" when satisfied with the output to move files.
    fi
done

相关参考:

答案2

我认为你的目标是

find . -iname "*.jpg" -type f -exec identify -format '%w %h %i\n' {} + | 
    awk '($1 != 256 || $2 != 256) {print $3}' | xargs -I{} echo mv -n -- {} path/to/newdir/

echo首先添加以试运行命令)。但是,{print $3}如果文件名%i包含空格,awk 会中断,这是一个明显的问题。如果您可以保证不会出现另一个字符%i,则可以更改格式以使用该字符,然后-format '%w:%h:%i\n'相应地修改 awk 字段分隔符,即

find . -iname "*.jpg" -type f -exec identify -format '%w:%h:%i\n' {} + | 
  awk -F':' '($1 != 256 || $2 != 256) {print $3}' | xargs -I{} echo mv -n -- {} path/to/newdir/

对于包含空格的文件名,但不是换行符,您可以使用以下 bash shell 构造

find . -iname "*.jpg" -type f -exec identify -format '%w %h %i\n' {} + | 
  while read -r w h i; do 
    ((w != 256 || h != 256)) && echo mv -n -- "$i" path/to/newdir/ 
  done

这样就解决了单词分割的问题,因为 bashread将前两个 IFS 分隔字段之后的所有内容都放入变量中i

为了使其处理任何空格,包括换行符,您需要将分隔符设置为空字符\0-\n不幸的是 ImageMagick 似乎不支持这一点。请参阅ImageMagick:百分比转义处理

相关内容