Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 用于删除小图像的Bash脚本_Image_Bash_Awk_Delete File - Fatal编程技术网

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