web-dev-qa-db-fra.com

Est-il possible de faire un 'ls -R | grep "aname" * | rm; supprimer plusieurs fichiers dans plusieurs répertoires

J'ai installé (compilé) émeraude. La commande make uninstall n'a pas fonctionné (il n'y a pas de fichier Make car c'est juste un script). J'ai donc décidé de supprimer le fichier manuellement. Mais il y avait beaucoup de fichiers.

J'ai essayé certaines choses mais cela n'a pas fonctionné. Je suis donc venu ici pour demander conseil.

  • Existe-t-il une commande avec ls -R | grep blabla* que je puisse ajouter au répertoire de fichiers d'affichage (elle affiche uniquement le nom du fichier)
  • Y a-t-il un vrai ls -R | grep bla* | rm?
6
Cyclic

Si 'aname' doit être la partie de départ du nom de fichier, il le serait, à partir du répertoire actuel:

find -name "aname" -delete 

Btw .:

grep "bla"* somewhere

est presque toujours faux, puisque grep fait déjà des correspondances partielles, ce qui signifie qu’il trouve bla, blafasel et xybla simplement

grep bla somewhere

Partie ancienne supprimée de la réponse, à cause d'un malentendu:

À partir du répertoire actuel, si vous recherchez le mot 'aname' dans tous les fichiers, vous pouvez simplement utiliser:

find -exec grep "aname" {} ";" -delete 
6
user unknown

Ce que vous recherchez, c'est une combinaison de xargs, find et rm.

find dressera une liste de tous les fichiers correspondant à vos conditions, puis les écrira (terminaison nulle) dans stdout, qui sera redirigé vers xargs. xargs prendra les chaînes terminées par null et les utilisera comme arguments de rm.

find -L /path/to/dir -name "*name*" -print0 |xargs -0 -r  rm

source: http://linuxcommando.blogspot.com/2007/10/find-xargs-pipe.html

4
Huckle

Entre les autres réponses: vous pouvez appeler rm sans avoir besoin du programme xargs. En fait, vous pouvez généralement utiliser l'option exec pour find au lieu de xargs.

Pour appeler rm aussi peu de fois que possible, sur de gros lots de fichiers:

find /path/to/dir -name "*name*" -exec rm {} +

Pour appeler rm une fois pour chaque fichier:

find /path/to/dir -name "*name*" -exec rm {} ";"

Il existe également des options plus élaborées pour find qui seront modifiées dans le répertoire avant l'exécution de la commande.

0
Simon Clarkstone