donnant la sortie de grep à rm

47

J'essaie de canaliser la grepsortie vers rm, mais elle produit des trucs inutiles. Est-ce qu'un interrupteur est nécessaire rm? Ou peut rmpeut être fourni une expression rationnelle directement?

ls | grep '^\[Daruchini'| rm

rm: opérande manquant Essayez «rm --help» pour plus d’informations.

CodeBladeRunner
la source
Toujours copier-coller les messages d'erreur. (J'ai inséré le message d'erreur réel pour le bénéfice des futurs lecteurs. Mais je ne pouvais le faire que parce qu'il n'y a qu'un seul message d'erreur possible dans ce cas. La plupart du temps, il est essentiel d'avoir le message d'erreur exact pour comprendre le problème. Il faut donc toujours copier-coller tous les messages d'erreur au complet.)
Gilles, arrête de faire le mal '18

Réponses:

57

Vous devez utiliser xargspour transformer une entrée standard en arguments pour rm.

$ ls | grep '^Dar' | xargs rm

(Attention aux caractères spéciaux dans les noms de fichiers; avec GNU grep, vous pourriez préférer

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

)

De plus, bien que le shell n'utilise pas les expressions rationnelles, c'est un modèle simple:

$ rm Dar*

(Pendant ce temps, je pense avoir besoin de plus de sommeil.)

geekosaur
la source
2
En supposant que le demandeur ne se soit pas trompé lorsqu’il a posté la question, il est après rm Dar*, pas rm !(Dar*).
Gilles 'SO- arrête d'être méchant'
... oui, oui, j'étais coincé en zsh ^mode (semblable à la basg !chose).
geekosaur
1
+1 Excellente réponse, je devais ajouter | tr "\n" "\0"avant le xargsbit. Vu dans ce post: stackoverflow.com/questions/20307299/…
Adam Plocher
5

Ne pas analyser la sortie dels .

Ici, il est très simple de faire en sorte que le shell filtre les fichiers souhaités. Notez que c'est le shell qui développe le motif Dar*, pas la rmcommande. Le développement de motif effectué par le shell s'appelle globbing .

rm Dar*

Dans les cas plus complexes, recherchez la findcommande.

Gilles, arrête de faire le mal
la source
3

Si vous souhaitez délimiter la sortie greppar des nouvelles lignes plutôt que par des espaces, vous pouvez le spécifier xargsvia cette -doption.

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

(comme décrit dans cette question)

mherzl
la source
2

Pour passer la sortie sous forme d'argument, j'ai tendance à utiliser une boucle while puisque je ne suis pas familier avec xargs.

ls | grep '^Dar' | while read line; do rm "$line";done;
Mitms
la source
c'est le seul qui a fonctionné dans mon cas.
Marbel
0

La meilleure commande pour moi est:

find ./Daruchini* -exec rm {}\;
Bodale
la source