Substituição ruim dentro do subshell xargs?

4

Estou usando este comando para processar arquivos PNG:

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

Parece funcionar bem, mas também gera isso para cada arquivo processado:

-: 1: -: Bad substitution

Eu suponho que estou fazendo algo errado aqui ${$1%.*} - mas eu não tenho certeza. O traço final está lá de propósito, conforme os documentos aqui - e eu não posso simplesmente canalizar tudo porque advpng não pode processar coisas de stdin / out, infelizmente - então eu tenho que usar nomes de arquivos.

Alguém sabe como consertar isso para não ter esse erro?

    
por Duncan Lock 06.07.2013 / 03:14

2 respostas

4

Um problema óbvio é a falta de citação:

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

Você está certo sobre a suposição de que ${$1%.*} é o problema real. Você não deve repetir o $ entre parênteses.

Os documentos não dizem nada sobre um traço à direita, não é? Apenas sobre um nome.

    
por 06.07.2013 / 03:24
1

Use o Paralelo GNU:

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

Você pode encontrar mais sobre o GNU Parallel em: link

Você pode instalar o GNU Parallel em apenas 10 segundos com:

wget -O - pi.dk/3 | sh 

Assista ao vídeo de introdução no link

    
por 06.07.2013 / 18:41