Find avec regex

Résolu/Fermé
charline159 Messages postés 208 Date d'inscription lundi 14 août 2017 Statut Membre Dernière intervention 22 juin 2022 - Modifié le 31 mars 2021 à 15:47
mamiemando Messages postés 33387 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 - 6 avril 2021 à 12:26
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 ?
A voir également:

2 réponses

mamiemando Messages postés 33387 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 7 803
Modifié le 1 avril 2021 à 12:26
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
0
charline159 Messages postés 208 Date d'inscription lundi 14 août 2017 Statut Membre Dernière intervention 22 juin 2022 1
1 avril 2021 à 21:20
Ça marche très bien de mon côté, j'ai pu supprimer ce que je voulais. Merci pour ta réponse!
0
mamiemando Messages postés 33387 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 27 novembre 2024 7 803
6 avril 2021 à 12:26
Parfait, bonne continuation :-)
0