Find avec regex [Résolu]

Signaler
Messages postés
175
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
8 avril 2021
-
Messages postés
29703
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
8 avril 2021
-
Salut, j'essaie de chercher tous les fichiers dont le nom est "file" suivi d'un nombre à 1 ou 2 chiffres (donc file1, file2, file10, etc.), avec cette commande:

find . -name "file[0-9]{1,2}"


cependant, ça ne fonctionne pas: je n'ai aucun résultat.

J'ai essayé de le faire avec
\{1,2\}
, mais pareil, ça ne marche pas non plus.

Je sais que je peux utiliser * , mais là je voudrais que le nombre de chiffre soit bien compris dans un certain intervalle (compris entre 1 et 2 dans le cas présent, mais ça pourrait très bien être entre 1 et 10 par exemple).

Auriez-vous une astuce ?

2 réponses

Messages postés
29703
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
8 avril 2021
7 066
Bonjour,

Le plus simple serait que
find
soit instancié de sorte à générer un sur-ensemble des fichiers que tu cherches (e.g. en listant tous les fichiers du répertoire dans lequel tu fais la recherche) et avec un pipe, de filtrer cette liste à l'aide de
grep
.

Dans ton cas :

find -type f . | grep "/file[0-9][0-9]$"


... ou :

find -type f . | egrep "/file[0-9]{2}$"


Quelques explications :
  • La commande
    find .
    va lister des fichiers contenant au moins un / devant le nom du fichier (si
    fichier
    est dans le répertoire courant, ce sera
    ./fichier
    ) ; on peut donc inclure
    /
    dans le motif de recherche, ce qui évitera d'accepter les fichiers dont le nom serait par exemple
    toto_file12
    ).
  • La syntaxe
    [0-9]
    signifie n'importe quel caractère compris entre
    0
    et
    9
    (au sens de l'alphabet sous-jacent, e.g. ASCII), donc ici n'importe quel caractère qui désigne un chiffre entre 0 et 9 inclus.
  • Le meta-caractère
    $
    signifie que le motif cherché par grep doit apparaître à la fin. Donc par exemple on accepte de garder
    toto/titi/file12
    mais on ne garde pas
    file12_toto
    .
  • Dans l'absolu
    grep
    permet aussi d'ancrer le filtrage sur le début des
    find
    on ne fait pas de même pour le début de chaîne car le nom du fichier est précédé par le nom du dossier qui le contient.


Exemple :

(mando@silk) (~/toto) $ touch file1 file12 file123

(mando@silk) (~/toto) $ find . -type f
./file123
./file12
./file1

(mando@silk) (~/toto) $ find . -type f | egrep "/file[0-9]{2}$"
./file123
./file12


Bonne chance
Messages postés
175
Date d'inscription
lundi 14 août 2017
Statut
Membre
Dernière intervention
8 avril 2021
1
Ça marche très bien de mon côté, j'ai pu supprimer ce que je voulais. Merci pour ta réponse!
Messages postés
29703
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
8 avril 2021
7 066
Parfait, bonne continuation :-)