web-dev-qa-db-fra.com

donner une sortie grep à rm

J'essaie de diriger la sortie de grep vers rm, mais cela génère des trucs inutiles. Un commutateur est-il requis pour rm? Ou rm peut-on fournir directement une expression rationnelle?

ls | grep '^\[Daruchini'| rm

rm: opérande manquant Essayez `rm --help 'pour plus d'informations.

50
CodeBladeRunner

Vous devez utiliser xargs pour transformer l'entrée standard en arguments pour rm.

$ ls | grep '^Dar' | xargs rm

(Méfiez-vous des caractères spéciaux dans les noms de fichiers; avec GNU grep, vous préférerez peut-être

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

)

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

$ rm Dar*

(en attendant, je pense que j'ai besoin de plus de sommeil.)

61
geekosaur

Ne pas analyser la sortie de ls .

Ici, il est très simple d'obtenir le Shell pour filtrer les fichiers que vous souhaitez. Notez que c'est le Shell qui étend le modèle Dar*, pas la commande rm. L'extension de modèle effectuée par le Shell est appelée globbing .

rm Dar*

Dans les cas plus complexes, recherchez la commande find.

Si vous souhaitez délimiter la sortie de grep par des sauts de ligne plutôt que par des espaces, vous pouvez spécifier cela à xargs via le -d option.

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

(comme décrit dans this question)

3
mherzl

Pour passer la sortie en argument, j'ai tendance à utiliser une boucle while car je ne suis pas familier avec les xargs.

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

Sur Catalina 10.15.3, avec zsh, la façon dont j'ai trouvé pour gérer les nouvelles lignes et les espaces blancs était:

 Sudo find / | grep -i 'yourString' | tr '\n' '\0' | xargs -0 -n1 rm -r 

En d'autres termes, en traduisant de nouvelles lignes sans espace (tr\n à\0) avant de les supprimer avec "rm -0".

De plus, j'utilise toujours 'find' + 'grep -i' car 'find -iname' ne produit parfois rien.

Une dernière remarque: il trouve et supprime les fichiers et dossiers qui correspondent à "yourString". Pour les fichiers uniquement, spécifiez "find -type f", puis l'option "-r" pour rm est inutile.

0
YvUh

La meilleure commande pour moi est:

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