Como usar pipes para referenciar stdout de um comando de dentro do stdin de outro?

4

Estou tentando entender como usar o stdout como o stdin de outro comando. Para testá-lo, estou tentando usar o seguinte comando para excluir todos os diretórios da pasta atual.

ls -d -- */ | rm -rf 

Eu esperaria que o resultado de ls -d - * / fosse canalizado para a entrada do rm, mas não funciona. Idéias?

    
por Pomario 06.08.2012 / 16:22

4 respostas

3

Nem todos os comandos / programas aceitarão diretamente a entrada canalizada (incluindo rm ). Além disso, por que você está usando a variável de substituição bash fora de um script?

Para o seu caso geral, você precisa examinar xargs , um utilitário cujo objetivo é simplificar esses cenários, pegando uma lista de stdin e invocando um comando com os elementos dessa lista (de diferentes formas possíveis).

Para o que você quer fazer ... (use-o com sabedoria!): rm -rf * (ou . ) será suficiente.

    
por ish 06.08.2012 / 16:31
3
find -maxdepth 1 -not -name ".*" -type d -print0 | xargs -n1 -0 rm -rf

-maxdepth 1 inclui apenas o diretório atual. -not -name ".*" exclui diretórios ocultos. -type d inclui apenas diretórios, não arquivos. find -print0 usado com xargs -0 usará arquivos e diretórios que tenham nomes com caracteres estranhos. xargs -n1 executa o comando (neste caso rm) uma linha por vez.

    
por roguesith 06.08.2012 / 17:06
2

Duas opções:

ls -d -- */ | xargs rm -r

ou

rm -r 'ls -d -- */'

No passado, xargs era necessário porque havia um limite nas listas de argumentos da linha de comando. O xargs colocará um número razoável em cada execução e executará o comando especificado várias vezes (ele também possui algumas coisas interessantes para ajudá-lo a executar simultaneamente). No entanto, nos kernels recentes, esta limitação se foi, então o comando rm mais simples sem pipe funcionará bem, embora use mais RAM, então se houver muitos milhares de argumentos, os xargs ainda serão mais eficientes.

Vale a pena notar que você não precisa de -f para rm, pois isso é necessário apenas quando você deseja que o rm continue quando um arquivo não existir ou para ignorar qualquer confirmação interativa. Desde que você tenha ls dizendo que eles existem, é mais seguro deixá-lo desligado, e então o usual -i alias irá salvá-lo da exclusão acidental de arquivos e diretórios protegidos contra gravação.

    
por SpamapS 06.08.2012 / 17:18
0

Neste caso específico, você também pode usar find :

find . -maxdepth 1 -type -d -exec rm -rf {} \;
    
por Will Sheppard 26.11.2013 / 14:14

Tags