xargsサブシェルに代替エラーがありますか?

xargsサブシェルに代替エラーがありますか?

このコマンドを使用して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- 残念ながら、stdin / outputからの内容を処理する方法がないため、全体をパイプで接続することはできません。したがって、ファイル名を使用する必要があります。

このエラーが発生しないように、この問題を解決する方法を知っている人はいますか?

答え1

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

関連情報