commande find avec quantificateur d'expressions régulières, par exemple {1,2}

14

J'ai essayé de créer une chaîne de commande find qui trouvera tous les fichiers se terminant par un nombre 1-99 mais exclut tous les autres.

Par exemple, je veux trouver monfichier1 monfichier99 mais pas monfichier456 et non monfichierbackup

Le regex auquel je pense est myfile[1-9]{1,2}mais je ne peux pas faire fonctionner cela avec find.

find . -regex '.*myfile[0-9]{1,2}' OU find . -iname 'myfile[0-9]{1,2}'

D'après ce que je peux voir, c'est la {1,2}partie qui ne fonctionne pas.

(au fait, pouvez-vous utiliser de -name -regexmanière interchangeable?)

Toute aide appréciée.

Lukas88
la source
1
-iname(et -name) utilisent des globes , qui n'ont pas cette syntaxe.
l0b0

Réponses:

10

Tu pourrais essayer

find . -regex '.*myfile[0-9][0-9]?'

ou

find . \( -name "myfile[0-9][0-9]" -o -name "myfile[0-9]" \)
l0b0
la source
Merci - la première ligne fonctionne pour moi. J'avais essayé avec -iname mais je ne pense pas que cela supporte la syntaxe, sinon je fais quelque chose de mal.
Lukas88
17

Si vous avez GNU find, vous pouvez utiliser un autre type d'expression régulière:

find . -regextype sed -regex '.*myfile[0-9]\{1,2\}'

Selon GNU, il findutilise une syntaxe d'expression régulière Emacs stérilisée par défaut - Emacs prend en charge la syntaxe, mais au moins GNU ne la prend pas en charge.\{from,to\}find

Étrangement, le manuel de référence ne comprend pas de section sur la sedsyntaxe des expressions régulières, alors qui sait quelles parties de celui-ci sont prises en charge.

l0b0
la source
1
sedcomme edsemble être un alias pour posix-basic, devrait donc être compatible avec POSIX BRE (bien qu'il supporte certaines extensions comme \+). Il n'est pas compatible avec GNU sedoù, par exemple, [\n]correspond à une nouvelle ligne au lieu de la barre oblique inverse ou nrequis par POSIX. Voir aussi -regextype posix-extendedpour les ERE POSIX (donc .*myfile[0-9]{1,2}), aussi avec des extensions comme \sou\<
Stéphane Chazelas
Je n'ai jamais connu -regextype. Il semble que si vous l'utilisez, -regextype egrepvous pouvez éviter les contre-obliques.
Sridhar Sarnobat