Supprimer des fichiers avec une expression régulière


41

J'ai essayé de supprimer les fichiers commençant par A et se terminant par 2 chiffres, mais cela ne fait rien.
Ce que j'ai essayé:

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

Où ai-je tort?

Réponses:


56

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 répertorie tous les fichiers (un par ligne car le résultat est canalisé).

  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 un nombre quelconque 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" rms'exécute rm lineune fois pour tout ce linequi lui est acheminé.

Où ai-je tort?

Pour commencer, rmn'accepte pas une expression régulière comme argument. Outre le caractère générique *, tous les autres personnages sont traités littéralement.

De plus, votre expression régulière est légèrement décalée. Par exemple, *signifie que toutes les occurrences ...dans une expression régulière, de sorte A*matchs A, AAetc. et même une chaîne vide.

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


3
Méfiez-vous des espaces dans les noms de fichiers.
slhck

1
Le -d"\ncommutateur résout le problème des espaces.
Frg

1
Remarque - certaines distributions (comme Mac OS) n'ont pas de grep -P(expression rationnelle Perl). grep -Epeut fonctionner dans ce cas.
bluescrubbie

1
Je préfère utiliser -Iavec xargset toujours tester avec des commandes non létales d'abord:xargs -d"\n" -I {} echo "{}"
jozxyqk

1
Analyse ls? Voir cette question qui pointe vers cet article . En raison des pièges, vous pouvez rmce que vous ne voulez pas.
Kamil Maciorowski

46

Ou en utilisant find:

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

Cette solution traitera les noms de fichiers étranges .


5
C'est une excellente solution. Je le préfère car il est plus simple et vous pouvez d'abord omettre le drapeau -delete à la fin pour voir si votre expression régulière est correcte avant de supprimer en masse vos fichiers.
JAMESSTONEco

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

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

@Alex non, le répertoire doit être vide (ce n'était pas une exigence OP de toute façon), vous pouvez utiliser l' xargsapproche avec rm -f.
cYrus


1

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

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

Si c'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
Cela ne semble pas ajouter beaucoup au-delà de ce que dit déjà la réponse de Dennis, âgée de 4 ans .
8bittree

1
"200 fois" est un terme assez spécifique. De nombreuses autres commandes sont également très puissantes, il vous suffit d'apprendre à les utiliser.
glenn jackman

1

Cela fonctionne sur mon mac:

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


0

find La commande fonctionne également avec les expressions rationnelles.

Vérifiez quels fichiers vont être supprimés

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

Supprimer les fichiers

find . -regex '^A.*[0-9]{2}$' -delete
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.