Pipelining e xargs

0

Estou tentando excluir alguns arquivos. class de um diretório. Então, primeiro eu cansei de contar o arquivo .class disponível usando o seguinte comando (depois de ir para o diretório) -

$ find . -name *.class | wc -l   

Aqui eu posso entender o papel do pipelining (|) - a saída do comando / processo find funciona como uma entrada do comando wc (por favor me corrija se eu estiver errado). O comando acima funciona bem para mim e produz a saída correta. Mas quando estou tentando excluir todos os arquivos. class usando o seguinte comando com pipelining -

$ find . -name *.class | rm *  # case-1

então não funciona. Mostra o seguinte erro -

rm: cannot remove '<a_directory_name>': Is a directory
rm: cannot remove '<an_another_directory_name>': Is a directory  

Mas quando eu uso xargs , funciona bem -

$ find . -name *.class | xargs rm *  # case-2

Agora minha pergunta é alguém pode me dizer por que case-1 não funciona enquanto o case-2 funciona bem? .

Obrigado antecipadamente.

    
por Razib 16.03.2015 / 19:41

1 resposta

2

A razão pela qual o Case-1 não funciona é que rm não aceita os argumentos via STDIN, ele leva os argumentos ou arquivos para remover como:

rm file_1 file_2

Considerando que em Case-2 xargs pega a saída do comando find via STDIN e converte os nomes dos arquivos como argumentos para o comando rm .

Por favor, leia man rm e man xargs para ter mais ideias sobre isso.

    
por heemayl 16.03.2015 / 19:48