Find avec regex

Résolu
charline159 Messages postés 216 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    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
  2. charline159 Messages postés 216 Statut Membre 1
     
    Ça marche très bien de mon côté, j'ai pu supprimer ce que je voulais. Merci pour ta réponse!
    0
    1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
       
      Parfait, bonne continuation :-)
      0