Como chamar os nomes dos diretórios depois de passá-los todos para xargs?

0

Estou usando o find para passar todos os diretórios para xargs, e o comando em cada diretório pelo xargs precisa criar um novo diretório para cada um, parecido com o dirname_a, então como isso pode ser feito?

ou seja

find . -type d -print0 | xargs -0 mkdir ${DIR}_a && mogrify -path ${DIR}_a -resize '1200x1200>' -quality 95 ${DIR}/*{.jpg|.JPG} {} \;

$ {DIR} não está funcionando, pois deve estar errado

eu posso usar

for D in ./* ; do mkdir ${D}_a && mogrify -path ${D}_a -resize '1200x1200>' -quality 95 ${D}/*{.jpg|.JPG}; done

mas isso não será executado em diretórios ou arquivos com espaços nos nomes, e é por isso que procurei encontrar o xargs.

    
por mozerella 10.04.2013 / 18:02

3 respostas

1

Aqui está um bom truque de xargs com a combinação de parâmetros -I e -n1 .

find . -mindepth 1 -type d | xargs -n1 -I {} bash -c 'mkdir "{}_a" && mogrify -path "{}_a" -resize 1200x1200\> -quality 95 "{}/"*.{jpg,JPG}'

-I {} diz ao xargs para fazer uma substituição quando encontrar a string {} no comando. -n1 diz ao xargs para processar o resultado da busca uma linha por um.

Você quer gerar múltiplas instâncias de mogrify, você pode adicionar o parâmetro -P5 a xargs.

Isso gerará 5 processos por vez e reduzirá consideravelmente seu tempo de processo, especialmente se você tiver muitas fotos para converter.

    
por 10.04.2013 / 21:03
1

Não use xargs . Experimente um loop:

find . -mindepth 1 -type d | 
 while IFS= read -r dir; do mkdir "$dir"_a && 
  mogrify -path "$dir"_a -resize '1200x1200>' -quality 95 "$dir/"*.{jpg,JPG}; \
 done
    
por 10.04.2013 / 19:17
1

Se a string armazenada em uma variável puder conter espaços, você deverá colocar aspas duplas em torno da variável, ou seja,

for D in ./* ; do mkdir "$D"_a && .... ; done
    
por 10.04.2013 / 19:21

Tags