我没有编写我要粘贴的脚本,我找到它并稍微修改它,因为我不知道自己该怎么做。这是当前的代码:
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 }'
没有任何事情发生,什么都没有删除,为什么不呢?
答案 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的这些功能的更多信息,请参阅以下链接: