Bash脚本删除小图像

时间:2015-01-05 06:39:58

标签: image bash awk delete-file

我没有编写我要粘贴的脚本,我找到它并稍微修改它,因为我不知道自己该怎么做。这是当前的代码:

for F in *.jpg *.gif ; do
identify "$F"
done | awk '{ split($3, wh, /x/); } wh[1] < 800 && wh[2] < 800 { print $1 }'

这可以在任一维度上显示尺寸小于800px的图像。 但是,如果我尝试将其更改为:

for F in *.jpg *.gif ; do
identify "$F"
done | awk '{ split($3, wh, /x/); } wh[1] < 800 && wh[2] < 800 { rm -vfr $1 }'

没有任何事情发生,什么都没有删除,为什么不呢?

2 个答案:

答案 0 :(得分:3)

rm shell 命令,而不是awk命令。

执行所需操作的一种方法是使用awk打印文件名(可以做),然后将其输入到能够执行的操作中删除:

for F in *.jpg *.gif ; do
    identify "$F"
done | awk '{split($3,wh,/x/);} wh[1]<800 && wh[2]<800 {print $1}' | xargs rm

我还没有检查您的其他代码是否有效,我假设这是因为脚本在您进行更改之前正在运行。

xargs将收到其标准输入的列表,并将其批处理以针对它们运行特定命令。因此,例如,以下序列:

touch paxjunk001
touch paxjunk002
echo paxjunk* | xargs rm

实际上与以下内容相同:

touch paxjunk001
touch paxjunk002
rm paxjunk001 paxjunk002

让它处理&#34;奇怪的&#34;文件名(例如包含空格的文件名)是使用NUL字符作为分隔符而不是空格的问题。

这意味着您的awk print命令将变为:

{ printf "%s\0", $1 }`

正确分隔文件名,并使用:

xargs --null

确保xargs了解格式。

答案 1 :(得分:1)

如果您使用的是ImageMagick,则可以按照identify测试图片大小。 -format切换到identify非常强大,可以进行大量计算。

例如:

identify -format '%[fx:w<800 && h<800]' image.jpg
如果图像的宽度小于800px且高度小于800px,

将输出到stdout 1,否则输出0。使用它比解析identify的原始输出的解决方案更安全,因为只要文件名包含空格,解决方案就会中断。

我建议改用这些东西:

#!/bin/bash
shopt -s nullglob
for f in *.jpg *.gif; do
    a=$(identify -format '%[fx:w<800 && h<800]' -- "$f") || continue
    if [[ $a = 1 ]]; then
        echo rm -v -- "$f"
    fi
done

这只会回显rm命令,并且不会执行它们。如果您对所看到的内容感到满意,请移除echo前面的rm命令。

有关ImageMagick的这些功能的更多信息,请参阅以下链接:

相关问题