Por que a entrada para xargs é 1 string, mas sem strings em linha separada?

0

Estou tentando enviar o arquivo para rm via xargs. Eu entendo que o que estou tentando fazer pode ser feito com o git clean, mas eu estou praticando o cli.
Eu tentei isso:

for files in $(git status --porcelain| sed 's/^??//g'); do echo $files; done | xargs rm -rf

mas não funcionou. Eu percebi que era porque ao executar isso:

for files in $(git status --porcelain| sed 's/^??//g'); do echo $files; done | xargs

Os arquivos parecem estar em uma string separada por um espaço.
Mas quando executo for files in $(git status --porcelain| sed 's/^??//g'); do echo -n $files; done , os arquivos são exibidos no console em uma linha separada.

Então (se estou certo) qual é a diferença entre:
for files in $(git status --porcelain| sed 's/^??//g'); do echo -n $files; done | xargs
e

for files in $(git status --porcelain| sed 's/^??//g'); do echo -n $files; done

e os arquivos no segundo caso são exibidos cada um em cada linha e no primeiro caso é uma string? E como eu iria consertar isso para que funcione com rm -rf?

    
por Jim 27.02.2015 / 22:50

1 resposta

1

Você está tornando sua vida mais complicada do que o necessário; -)

Se o comando subshell (a expressão dentro de seu $() ) já fornecer uma lista de nomes de arquivos, e o "comando target" (rm -rf no seu caso) já aceitar uma lista de nomes de arquivos, por que não usar

git status --porcelain| sed 's/^??//g' | xargs rm -rf

Ou, se você deseja praticar um "loop for" no bash, você não precisa de xargs:

for f in $(git status --porcelain| sed 's/^??//g') ; do
    rm -rf $f
done

BTW ... verifique duplamente seus comandos 'rm -rf' (adicionando um 'echo' antes de 'rm -rf') antes de executá-los, erros bobos acontecem e você vai se arrepender!

    
por 28.02.2015 / 12:12