Image 用于删除小图像的Bash脚本
我没有写我将要粘贴的脚本,我找到了它并稍微修改了一下,因为我自己不知道怎么做。以下是当前代码:Image 用于删除小图像的Bash脚本,image,bash,awk,delete-file,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 }' 用于*.jpg*.gif中的F;做 识别“$F” 完成| awk'{split($3,wh,/x/);}wh[1]
for F in *.jpg *.gif ; do
identify "$F"
done | awk '{ split($3, wh, /x/); } wh[1] < 800 && wh[2] < 800 { print $1 }'
用于*.jpg*.gif中的F;做
识别“$F”
完成| 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 }'
用于*.jpg*.gif中的F;做
识别“$F”
完成| awk'{split($3,wh,/x/);}wh[1]<800&&wh[2]<800{rm-vfr$1}'
什么也不发生,什么也不删除,为什么不呢?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
实际上与以下内容相同:
touch paxjunk001
touch paxjunk002
rm paxjunk001 paxjunk002
要让它处理“奇怪”的文件名,比如那些带有空格的文件名,需要使用NUL字符作为分隔符,而不是空格
这意味着您的awk
print
命令将变成如下内容:
{ printf "%s\0", $1 }`
要正确分隔文件名,请使用:
xargs --null
为确保xargs理解格式。如果您使用的是ImageMagick,您可以推迟到
确定
有关图像大小的测试。-format
切换到identify
功能非常强大,可以进行大量计算
例如:
identify -format '%[fx:w<800 && h<800]' image.jpg
这将只回显rm
命令,而不会执行它们。如果您对看到的内容感到满意,请删除rm
前面的echo
命令
有关ImageMagick这些功能的更多信息,请参阅以下链接:
- ,
- “什么都不删除,为什么不?”:因为
rm-vfr$1
是放置在awk
脚本中的shell命令,awk
支持awk
命令,而不是shell命令。一种不安全的方法是:awk。。。{print“rm-vfr'$1”;“}bash
非常感谢,我发现很难解释我是如何理解你的意思的——尽管我理解!也许:我是从第一个引号到最后跟程序xargs说话,而不是shell,因此它是我给它的命令的解释器。
identify -format '%[fx:w<800 && h<800]' image.jpg
#!/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