dando saída grep para rm


47

Estou tentando canalizar a grepsaída para rm, mas gera coisas inúteis. É necessário algum switch rm? Ou pode rmser fornecido um regexp diretamente?

ls | grep '^\[Daruchini'| rm

Operando rm: ausente Tente `rm --help 'para obter mais informações.


Sempre copie e cole as mensagens de erro. (Eu inseri a mensagem de erro real para o benefício de futuros leitores. Mas só posso fazer isso porque há apenas uma mensagem de erro possível nesse caso. Na maioria das vezes, é vital ter a mensagem de erro exata para entender o problema Portanto, sempre copie e cole todas as mensagens de erro na íntegra.)
Gilles 'SO- stop be evil'

Respostas:


57

Você precisa usar xargspara transformar a entrada padrão em argumentos para rm.

$ ls | grep '^Dar' | xargs rm

(Cuidado com caracteres especiais nos nomes de arquivos; com o GNU grep, você pode preferir

$ ls | grep -Z '^Dar' | xargs -0 rm

)

Além disso, enquanto o shell não usa regexps, esse é um padrão simples:

$ rm Dar*

(Enquanto isso, acho que preciso dormir mais.)


2
Assumindo que o solicitante não cometeu um erro quando ele postou a pergunta, ele procurou rm Dar*, não rm !(Dar*).
Gilles 'SO- stop be evil'

... certo, sim, eu estava preso no zsh ^modo (semelhante à basg !coisa).
Geekosaur

1
+1 Ótima resposta, eu tive que adicionar | tr "\n" "\0"antes da parte xargs. Vistos neste post: stackoverflow.com/questions/20307299/…
Adam Plocher

5

Não analise a saída dels .

Aqui, é muito simples fazer com que o shell filtre os arquivos que você deseja. Observe que é o shell que está expandindo o padrão Dar*, não o rmcomando. A expansão do padrão realizada pelo shell é chamada globbing .

rm Dar*

Em casos mais complexos, procure o findcomando


3

Se você deseja delimitar a saída greppor novas linhas em vez de espaço em branco, é possível especificar isso por xargsmeio da -dopção

$ ls | grep '^Dar' | xargs -d '\n' rm

(conforme descrito nesta pergunta)


2

Para passar a saída como argumento, costumo usar um loop while, pois não estou familiarizado com xargs.

ls | grep '^Dar' | while read line; do rm "$line";done;

este é o único que funcionou no meu caso.
Marcel1 #

0

O melhor comando para mim é:

find ./Daruchini* -exec rm {}\;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.