用于缩小 PNG 的 Bash 脚本不断停止

Jed*_*007 2 linux bash png

我现在尝试运行这个脚本几次,但它一直挂着。我有 60,000 张图像,它经过大约 1000 张然后停止。我一直在运行 top 命令,似乎 pngquant 进程消失了。任何帮助将非常感激。

我得到的最后一个输出是

Optimized PNG: ./12/thumbnail/112.png
Optimized PNG: ./12/thumbnail/photography.png
Optimized PNG: ./12/thumbnail/Christmas-01.png
Optimized PNG: ./12/thumbnail/OA1920.png
error: cannot open ./12/thumbnail/The for reading
Optimized PNG: ./12/thumbnail/The
error: cannot open Official for reading
Optimized PNG: Official
error: cannot open AndreasCY for reading
Optimized PNG: AndreasCY
Run Code Online (Sandbox Code Playgroud)

然后它停止了。脚本看起来像这样。

#!/bin/bash

cd /var/www/html/wp-content/uploads/2014/

for PNG in $(find . -name '*.png'); do

  pngquant --ext .png --force 256 ${PNG}
  echo "Optimized PNG: ${PNG}"

done
Run Code Online (Sandbox Code Playgroud)

G-M*_*ca' 5

Rui 的回答包含了一些很好的建议,尽管他似乎错过了您的命令失败的实际原因。从输出中可以看出您有一个名为../12/thumbnail/The Official AndreasCY ….png

当你说

for PNG in $(find . -name '*.png')
Run Code Online (Sandbox Code Playgroud)

就像在说

对于 ./12/thumbnail/112.png ./12/thumbnail/photography.png ./12/thumbnail/Christmas-01.png 中的 PNG \
           ./12/thumbnail/OA1920.png ./12/thumbnail/官方 AndreasCY ... . png ...

结果是./12/thumbnail/The, Official, 和AndreasCY 被当作​​单独的文件名对待——而且,由于它们不是,你会得到你得到的错误。您应该非常小心地使用$(…)来生成文件名列表——我的意思是,如果可能,请避免这样做。  find … -exec是一个更好的方法。但是,Rui 给出的命令不起作用:-exec "Optimized PNG: " 会失败,因为没有诸如"Optimized PNG: ".

我建议您保留原始答案和锐的答案的以下部分:

#!/bin/sh

cd /var/www/html/wp-content/uploads/2014         (你真的不需要最后的“/”。) 
find . -name '*.png' -type f ...

然后使用以下方法之一完成它:

  • -exec pngquant --ext .png --force 256 {} \; -exec echo "Optimized PNG:" {} \;
  • -exec pngquant --ext .png --force 256 {} \; -printf "Optimized PNG: %p\n"
  • -exec sh -c 'pngquant --ext .png --force 256 "$1"; echo "Optimized PNG: $1"' sh {} \;, 或者
  • -exec myscript {} \;
    这里myscript

    #!/bin/sh
    pngquant --ext .png --force 256 "$1"
    echo "Optimized PNG: $1"
    
    Run Code Online (Sandbox Code Playgroud)

请注意,您应该始终引用 shell 变量(例如,"$PNG""$1"),除非您有充分的理由不这样做,并且您确定自己知道自己在做什么。相比之下,虽然大括号(例如,${PNG})很重要,但它们不如引号重要。而且,根据一般原则,我建议您使用,#!/bin/sh 除非您明确编写依赖于 bash 功能的脚本,并且不能与 POSIX 兼容的 shell 一起使用——我建议不要这样做。