我现在尝试运行这个脚本几次,但它一直挂着。我有 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)
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 一起使用——我建议不要这样做。