如何删除小于特定尺寸的图像文件

如何删除小于特定尺寸的图像文件

我已经找到了一个答案,其中列出了几乎所有内容。但我无法让它工作。

我用:

find . -iname "*.jpg" -type f | xargs -I{} identify -format '%w %h %i' {} | awk '$1<300 || $2<300{print $3}'

删除输出文件需要什么?
我尝试在末尾添加 | rm,但出现错误,显示我缺少操作数。我希望删除上述代码打印的所有文件。

有人可以帮忙吗

答案1

chmod +x ~/checksize.sh下面的命令很有效,而且速度很快。保存到 ~/checksize.sh 并使用 chmod ( )使其可执行

#! /bin/bash

#find . -type f -exec bash -c ~/checksize.sh ;
echo ${@}
if [ -z "$1" ]
then
    echo "\$1 empty" >&2
    exit
fi

size=($(identify -format "%w %h" "$1" | tr -d "()"))
#echo ${size[@]}
#echo ${size[0]}
#echo ${size[1]}
if [ ${size[0]} -lt 300 -a ${size[1]} -lt 300 ]
then
    rm -v "$1"
fi

然后将目录更改为要从中删除太小的文件的目录。

通过 cd 进入目录后,运行以下命令:find . -type f | xargs -P 0 -L 1 ~/checksize.sh

它运行速度很快,因为它使用了 xarg 的 -P 0,这使得它能够xarg以最大并行度运行。有关详细信息,请参阅其手册页。

答案2

rm不从输入中读取文件名。您可以这样做:

find . -iname "*.jpg" -type f -exec bash -c 'for i; do size=($(identify -format "%w %h" "$i")); (( size[1] < 300 || size[2] < 300 )) && rm -v "$i"' remove-files {} +
  • 您可以使用-exec而不是xargs

bash 命令:

for i
do
    size=($(identify -format "%w %h" "$i"))
    (( size[0] < 300 || size[1] < 300 )) && rm -v "$i"
done
  • 循环遍历所有输入参数 ( for i)
  • 获取大小并将其存储在数组中(这就是为什么有括号$()($(identify -format "%w %h" "$i"))
  • 使用 shell 算法(( ))进行比较

答案3

您应该能够使用rm $(find...$3}')

换句话说,将上述命令包装在 $() 的括号内,以将结果用作 的参数rm

答案4

对于那些需要这种方式来处理当前 Bash 的人来说,这里是保存数组的现代化形式。

#!/bin/bash

for i in ./*.png; do
    mapfile -d " " -t size < <( identify -format "%w %h" "$i" )
    if [ "${size[0]}" -lt 1920 ] && [ "${size[1]}" -lt 1080 ]; then
        rm -v "$i"
    fi
done

相关内容