如何在 bash 中删除或移动特定尺寸目录中的每个图像到新目录

如何在 bash 中删除或移动特定尺寸目录中的每个图像到新目录

我正在尝试找到一种方法来执行以下操作(Google 仅返回查找的结果):

  1. 将指定尺寸(例如 1920x1080、宽度小于 1600 等)的所有文件类型(.jpg、.png 或 .gif 等)的图像从当前目录移动到另一个目录

  2. 删除当前目录中所有指定尺寸的图像。

答案1

这会将尺寸为 1920x1080 的所有 jpg、png 或 gif 文件从当前目录移动到targetdir

#!/bin/bash
shopt -s nullglob
for fname in *.jpg *.png *.gif
do
    read width height < <(exiv2 "$fname" 2>&1 | awk '/^Image size/{print $4,$6}')
    [ "$width" ] || continue
    [ "$width" -eq 1920 ] && [ "$height" -eq 1080 ] && mv "$fname" targetdir/
done

这将查看当前目录并删除所有宽度小于 1600 的 jpg、png 或 gif 图像:

#!/bin/bash
shopt -s nullglob
for fname in *.jpg *.png *.gif
do
    read width height < <(exiv2 "$fname" 2>&1 | awk '/^Image size/{print $4,$6}')
    [ "$width" ] || continue
    [ "$width" -lt 1600 ] && rm "$fname"
done

这使用exiv2实用程序捕获图像大小。在类似 Debian 的系统上,exiv2可以通过运行 进行安装。经过少量修改,可以使用apt-get install exiv2类似的实用程序,例如 ImageMagick 的。identify

此脚本需要bash

怎么运行的

  • shopt -s nullglob

    忽略缺失的文件类型。

  • for fname in *.jpg *.png *.gif; do

    这将开始循环遍历目录中名称以 、 和 结尾的.jpg所有.png文件.gif

  • read width height < <(exiv2 "$fname" 2>&1 | awk '/^Image size/{print $4,$6}')

    这将使用该exiv2实用程序提取图像大小。由于exiv2会产生几行输出,awk因此可用于选择我们需要的信息。

  • [ "$width" ] || continue

    如果我们没有从上述命令中恢复图像大小,则跳过此文件。例如,如果该文件实际上不是图像文件,就会发生这种情况。

  • [ "$width" -lt 1600 ] && rm "$fname"

    如果图片宽度符合我们的条件,则执行rm删除该文件。

  • done

    这标志着循环的结束。

相关内容