Passando valores através de pipes

3

Eu não entendo muito bem os canais na linha de comando do Linux.

Eu notei que:

ll - R | grep *.pdf

listará os arquivos que terminam em .pdf

Mas

locate *.pdf | du -h

não calcula o tamanho dos arquivos que terminam em .pdf . Em vez disso, listará o tamanho dos arquivos no diretório atual.

O que está errado aqui?

O que eu tenho em mente é que a saída do primeiro comando é a entrada do próximo.

    
por xiaohan2012 13.12.2011 / 07:32

2 respostas

7

Os tubos funcionam enviando a saída de um programa para a entrada de outro programa. Isso significa que o programa que recebe a saída do outro deve ser capaz de ler STDIN ( fluxos padrão ).

Nesse caso, grep é capaz de ler a saída de ll porque foi projetada dessa maneira. du espera um argumento de linha de comando apontando para o diretório em que ele deve ser executado (se um diretório não for fornecido, ele será padronizado para o diretório de trabalho atual ./ ).

Quanto a ver os tamanhos dos arquivos .pdf , se todos os arquivos estiverem em um diretório, você poderá executar du -h -d1 /path/to/pdf/dir ou locate *.pdf | xargs | du -h . Se eles estiverem em diretórios diferentes, você vai querer usar -exec e find juntos (outro usuário provavelmente lhe dará uma mão com isso, não tenho certeza de como fazê-lo).

    
por 13.12.2011 / 07:39
2

What I have in mind is the output of the first command is the input of the next.

Isso está correto. No entanto, em seus dois exemplos, a diferença é que grep age na entrada, enquanto du não. O piping funciona como esperado apenas se o primeiro comando der algo para a saída padrão e o segundo receber algo da entrada padrão , caso em que esses dois fluxos serão conectados através de um "tubo". Você pode descobrir se isso é possível procurando "entrada padrão" e "saída padrão" nas páginas de manual dos comandos.

    
por 13.12.2011 / 07:38