xargs 子 shell 内的替换错误?

xargs 子 shell 内的替换错误?

我使用这个命令来处理 PNG 文件:

find . -iname "*png" -print0 | xargs -r0 --max-procs=4 -n1 sh -c 'pngnq -s1 $1 && advpng -z -4 -q ${$1%.*}-nq8.png' -

它似乎实际上工作正常,但也为其处理的每个文件输出:

-: 1: -: Bad substitution

我认为我在这里做错了什么${$1%.*}- 但我真的不确定。根据文档,尾随破折号是故意的这里- 而且我不能只是通过管道传输整个内容,因为advpng无法处理来自标准输入/输出的内容,遗憾的是 - 所以我必须使用文件名。

有人知道如何解决这个问题,以免出现此错误吗?

答案1

一个明显的问题是缺少引用:

... sh -c 'pngnq -s1 "$1" && advpng -z -4 -q "${1%.*}"-nq8.png' -

您的假设是正确的,这才${$1%.*}是真正的问题。$括号中的内容不得重复。

文档没有提到尾随破折号,是吗?就一个名字而已。

答案2

使用 GNU 并行:

find . -iname "*png" -print0 | parallel -0 pngnq -s1 {} '&&' advpng -z -4 -q {.}-nq8.png

您可以在以下位置找到有关 GNU Parallel 的更多信息:http://www.gnu.org/s/parallel/

您只需 10 秒即可安装 GNU Parallel:

wget -O - pi.dk/3 | sh 

观看介绍视频http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

相关内容