Por que o pipe não funciona com 'find' e 'ls'?

0

Por que o pipe não funciona com 'find' e 'ls' Se eu faço find . -name *foo* | ls -lah , ele faz um ls em $PWD e não a saída de find.

A solução, no entanto, é find . -name *foo* | xargs -r ls -alh ou pode usar exec.

    
por sadashiv30 23.05.2016 / 18:49

1 resposta

3

Por favor, consulte a página de manual de ls(1) ! O comando ls leva seus argumentos na linha de comando não na entrada padrão (i. E. Descritor de arquivo 0).

Quando você corre

<SOME_COMMAND> | ls [OPTIONS...]

você instrui o interpretador de comandos a criar um pipe ( | ) da saída padrão do comando esquerdo para a entrada padrão do comando direito (aqui: ls ). Mas ls desconsidera sua entrada padrão e inspeciona seus parâmetros de linha de comando, não encontrando nenhum argumento posicional e listando o diretório de trabalho atual (armazenado na variável de ambiente PWD por interpretadores de shell como Bash). / p>

O xargs(1) leva tokens (delimitado por caracteres de espaço em branco, se não especificado de outra forma) de seu fluxo de entrada padrão e os adiciona como parâmetros à linha de comando de outro comando a ser executado. No seu caso, o comando ls dado a xargs recebe um conjunto de nomes de caminho em sua linha de comando e executa sua tarefa conforme documentado pelo manual.

Bônus: A opção "comando" -ls para GNU find imprimirá os caminhos correspondentes de maneira semelhante a ls -dils (veja find(1) ).

    
por David Foerster 23.05.2016 / 19:31