web-dev-qa-db-fra.com

Supprimer des 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 cela ne fait rien.
Ce que j'ai essayé:

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

Où est-ce que je me trompe?

34
gdoron

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 redirigé).

  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 lui est connecté.

Où est-ce que je me trompe?

Pour commencer, rm n'accepte pas une expression régulière en tant qu'argument. Outre le caractère générique *, tous les autres caractères sont traités littéralement.

En outre, votre expression régulière est légèrement en retrait. Par exemple, * signifie toutes les occurrences 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 .

48
Dennis

Ou en utilisant find:

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

Cette solution traitera avec des noms de fichiers étranges .

42
cYrus

Voir la section Extension du nom de fichier de la page de manuel bash:

rm A*[0-9][0-9]
10
glenn jackman

La solution avec regexp est 200 fois mieux, même avec cela, vous pouvez voir quel fichier sera supprimé avant d'utiliser la commande, coupant ainsi le pipe final:

ls | grep -P "^A.*[0-9]{2}$"

Ensuite, s'il est correct, utilisez simplement:

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

C'est 200 fois mieux, car si vous travaillez avec Unix, il est important de savoir comment utiliser grep. C'est très puissant si vous savez comment l'utiliser.

1
Salvatore

Cela fonctionne sur mon mac:

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

1
Ray