90 votes

Supprimer les fichiers avec une expression régulière

J'ai essayé de supprimer les fichiers qui commencent par A et se terminent par 2 chiffres mais ça ne fait rien.
Ce que j'ai essayé:

rm ^A*[0..9]2$

Où est-ce que j'ai tort?

104voto

Dennis Points 46916

Vous pouvez utiliser la commande suivante pour supprimer tous les fichiers correspondant à vos critères:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm

Comment ça marche:

  1. ls liste tous les fichiers (un par ligne puisque le résultat est passé en pipe).

  2. grep -P "^A.*[0-9]{2}$" filtre la liste des fichiers et ne laisse que ceux qui correspondent à l'expression régulière ^A.*[0-9]{2}$

    • .* indique n'importe quel nombre d'occurrences de ., où . est un caractère générique correspondant à n'importe quel caractère.

    • [0-9]{2} indique exactement deux occurrences de [0-9], c'est-à-dire, n'importe quel chiffre.

  3. xargs -d"\n" rm exécute rm line une fois pour chaque line qui est passée en pipe.

Où ai-je tort?

Pour commencer, rm n'accepte pas une expression régulière comme argument. Mis à part le caractère générique *, chaque autre caractère est traité littéralement.

De plus, votre expression régulière est légèrement incorrecte. Par exemple, * signifie n'importe quelle occurrence de ... dans une expression régulière, donc A* correspond à A, AA, etc. et même à une chaîne vide.

Pour plus d'informations, visitez Regular-Expressions.info.

3 votes

Faites attention aux espaces dans les noms de fichiers.

1 votes

La balise -d"\n corrige le problème d'espaces.

3 votes

Note - certaines distributions (comme Mac OS) n'ont pas de grep -P (regex Perl). grep -E peut fonctionner dans ce cas.

81voto

cYrus Points 20338

Ou en utilisant find :

find your-directory/ -name 'A*[0-9][0-9]' -delete

Cette solution traitera les noms de fichiers bizarres.

12 votes

C'est une excellente solution. Je la préfère car elle est plus simple et vous pouvez omettre le drapeau -delete à la fin en premier pour voir si votre regex est correcte avant de supprimer en masse vos fichiers.

2 votes

De plus, vous avez plus de contrôle sur ce que vous supprimez, par exemple en ajoutant -type f

0 votes

Peut-il être utilisé pour supprimer des fichiers et des dossiers ? Cela ne fonctionne pas pour les dossiers non vides.

19voto

Abbas Points 3737

Consultez la section d'expansion de nom de fichier de la page manuel de bash:

rm A*[0-9][0-9]

0 votes

A bien fonctionné pour moi.

0 votes

C'était la réponse la plus simple, mais complète à la question.

0 votes

Est-ce que cela fonctionnera si le dossier contient beaucoup de fichiers?

4voto

Petr Javorik Points 186

La commande find fonctionne également avec des regex.

Vérifiez quels fichiers vont être supprimés

find . -regex '^A.*[0-9]{2}$'

Supprimez les fichiers

find . -regex '^A.*[0-9]{2}$' -delete

0 votes

Celui-ci ne fonctionne pas sous sa forme actuelle. Vous devez définir -regextype egrep pour que les quantificateurs de type {x,y} fonctionnent.

3voto

Ray Points 21

Cela fonctionne sur mon mac :

rm $(ls | grep -e '^A*[0..9]2$')

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X