web-dev-qa-db-fra.com

Supprimer une liste de fichiers avec find et grep

Je souhaite supprimer tous les fichiers dont le nom contient un mot spécifique, par exemple. "voiture" . Jusqu'ici, je suis venu avec ceci:

find|grep car

Comment est-ce que je passe la sortie à rm?

29
Magnus
find . -name '*car*' -exec rm -f {} \;

ou passez la sortie de votre pipeline à xargs:

find | grep car | xargs rm -f

Notez que ce sont des outils très contondants et que vous êtes susceptible de supprimer des fichiers que vous n'aviez pas l'intention de supprimer. En outre, aucun effort n'est fait ici pour traiter les fichiers contenant des caractères tels que les espaces (y compris les nouvelles lignes) ou les tirets. Être averti. 

74
William Pursell

Pour afficher ce que vous allez supprimer en premier, puisque rm -fr est tel qu'une commande dangereuse:

find /path/to/file/ | grep car | xargs ls -lh

Ensuite, si les résultats correspondent à vos attentes, exécutez la commande réelle en supprimant le ls -lh et en le remplaçant par le rm -fr.

find /path/to/file/ | grep car | xargs rm -fr
9
Tony-Caffe

Ceci trouve un fichier avec le motif correspondant (* .xml) et insère son contenu dans la chaîne correspondante (exclude = "1") et le supprime si une correspondance est trouvée.

find . -type f -name "*.xml" -exec grep exclude=\"1\" {} \; -exec rm {} \;
2
Neal Garrett

Vous voulez vraiment utiliser find avec -print0 et rm avec --:

find [dir] [options] -print0 | grep --null-data [pattern] | xargs -0 rm --

Un exemple concret (suppression de tous les fichiers situés sous le répertoire actuel contenant car dans leur nom de fichier):

find . -print0 | grep --null-data car | xargs -0 rm --

Pourquoi est-ce nécessaire:

  • -print0, --null-data et -0 modifient le traitement des entrées/sorties analysées en tant que jetons séparés par des espaces blancs en analysés en tant que jetons séparés par le caractère \0-. Cela permet le traitement de noms de fichiers inhabituels (voir man find pour plus de détails)
  • rm -- s'assure de réellement supprimer les fichiers commençant par - au lieu de les traiter comme des paramètres de rm. Dans le cas où il existe un fichier appelé -rf et do find . -print0 | grep --null-data r | xargs -0 rm, le fichier -rf ne sera peut-être pas supprimé, mais modifiera le comportement de rm sur les autres fichiers.
2
Qw3ry

Un peu de nécromancie, mais vous pouvez aussi utiliser find, grep et xargs

find . -type f | grep -e "pattern1" -e "pattern2" | xargs rm -rf

^ Find aura besoin d’un peu d’attention pour le faire fonctionner potentiellement pour vos besoins, comme un fichier, mindepth, maxdepth et tout déplacement.

1
mcdoomington

Vous pouvez utiliser ls et grep pour trouver vos fichiers et rm -rf pour les supprimer.

rm -rf $(ls | grep car)

Mais ce n’est pas une bonne idée d’utiliser cette commande s’il existe une chance que des répertoires ou des fichiers ne soient pas supprimés, car ils ont des noms avec le modèle de caractère que vous spécifiez avec grep.

0
nsssayom
find start_dir -iname \*car\* -exec rm -v {} \;
0
X Tian