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?
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:
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:
ls
répertorie tous les fichiers (un par ligne car le résultat est canalisé).
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.
xargs -d"\n" rm
s'exécute rm line
une fois pour tout ce line
qui lui est acheminé.
Où ai-je tort?
Pour commencer, rm
n'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
, AA
etc. et même une chaîne vide.
Pour plus d'informations, visitez Regular-Expressions.info .
-d"\n
commutateur résout le problème des espaces.
grep -P
(expression rationnelle Perl). grep -E
peut fonctionner dans ce cas.
-I
avec xargs
et toujours tester avec des commandes non létales d'abord:xargs -d"\n" -I {} echo "{}"
ls
? Voir cette question qui pointe vers cet article . En raison des pièges, vous pouvez rm
ce que vous ne voulez pas.
Ou en utilisant find
:
find your-directory/ -name 'A*[0-9][0-9]' -delete
Cette solution traitera les noms de fichiers étranges .
-type f
xargs
approche avec rm -f
.
Voir la section d' extension du nom de fichier de la page de manuel bash:
rm A*[0-9][0-9]
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.
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