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

한 가지 명백한 문제는 참조가 누락되었다는 것입니다.

... 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

관련 정보