Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Expressions régulières
  3. find, la commande de recherche de fichiers
Extrait - Expressions régulières Syntaxe et mise en œuvre (avec exercices et corrigés) (2e édition)
Extraits du livre
Expressions régulières Syntaxe et mise en œuvre (avec exercices et corrigés) (2e édition) Revenir à la page d'achat du livre

find, la commande de recherche de fichiers

Description 

La commande find permet la recherche de fichiers ou de répertoires dans une ou plusieurs arborescences. Les critères de recherche sont multiples : ils peuvent porter sur les attributs des fichiers, c’est-à-dire les informations stockées dans l’i-node associé au fichier, ou sur le nom du fichier.

La syntaxe de la commande find de la FSF (Free Software Foundation) disponible sur GNU/Linux a été considérablement enrichie et légèrement assouplie depuis la création de la commande : le nombre d’options de find a plus que triplé depuis UNIX version 7, et certains arguments sont devenus facultatifs. La commande permet maintenant l’utilisation d’expressions régulières étendues, portant sur le nom long, et plus seulement sur le nom court comme dans la commande d’origine.

Les fonctionnalités de find qui nous intéressent dans le cadre de cet ouvrage sont celles relatives à la recherche de noms de fichiers ou répertoires car elles utilisent les expressions régulières.

Nous allons toutefois effectuer un bref rappel du fonctionnement de cette commande et de ses principales options.

Toutes les options et tous les tests présentés ici ne sont pas systématiquement disponibles dans l’ensemble des commandes find : leur existence dépend de la version du système...

Principe de fonctionnement 

La commande find recherche dans une ou plusieurs arborescences données des fichiers ou répertoires ayant des caractéristiques particulières qui lui sont spécifiées au moyen d’options suivies d’arguments indiquant les valeurs recherchées. Elle peut effectuer des actions spécifiées, comme afficher le nom des fichiers trouvés ou exécuter une commande à laquelle find peut passer le nom du fichier trouvé.

Elle effectue un parcours récursif à partir des différents répertoires qui lui sont spécifiés, chacun étant considéré comme la racine d’une arborescence à partir de laquelle la commande find va commencer une recherche.

Pour chaque nom de fichier trouvé lors du parcours des arborescences, find évalue une expression booléenne constituée de critères de recherches ou d’actions. Les éléments de l’expression booléenne sont évalués de gauche à droite jusqu’à ce que son résultat soit connu.

Pour mémoire, en notant || le OU logique, et && le ET logique, on connaît les résultats suivants de l’algèbre booléenne :

  • (VRAI||condition) est vrai quelle que soit la valeur de vérité...

Les options liées à l’i-node 

Les options liées à l’i-node (c’est-à-dire au descripteur de fichier) permettent de spécifier des critères relatifs aux éléments de l’i-node du fichier, par exemple :

  • le type,

  • le mode,

  • le nombre de liens,

  • l’UID (User ID) du propriétaire,

  • le GID (Group ID) du propriétaire,

  • la taille,

  • le numéro d’i-node,

  • les dates (de modification, d’accès, de changement de l’i-node),

  • etc.

Ces options sont des mots-clés précédés d’un unique tiret (-type, -perm, -uid, -user, -size, ...) suivies de la valeur recherchée. Dans le cas où la valeur en question est numérique, il est possible de la faire précéder d’un signe + ou d’un signe - pour indiquer que la valeur doit être respectivement supérieure ou inférieure (strictement) à la valeur qui suit.

1. Option -type 

Cette option retourne VRAI si le type du fichier correspond au type spécifié par le caractère c qui suit l’option -type, avec les significations suivantes :

  • f pour un fichier régulier.

  • d pour un répertoire (directory).

  • b pour un périphérique de type bloc.

  • c pour un périphérique de type caractère.

  • p pour une FIFO (pipe nommé).

  • l pour un lien symbolique.

  • s pour une socket (réseau).

Syntaxe

-type c 

Exemple

find /dev -type p 

Cette commande recherche sous le répertoire /dev tous les fichiers de type FIFO (-type p), et affiche leur nom long absolu puisque le nom du répertoire spécifié est un nom absolu. L’action par défaut est l’affichage du nom du fichier trouvé.

2. Option -perm 

Cette option retourne VRAI si le mode du fichier correspond au mode d’accès spécifié en octal.

Syntaxe

-perm mode_octal 

Exemple

find /bin /usr/bin /sbin /usr/sbin ! -type l -perm -02 -ls 

Cette commande recherche sous /bin, /usr/bin, /sbin et /usr/sbin tous les fichiers qui ne sont pas des liens symboliques (! -type l), dont le mode est au moins 002 (-perm -02), c’est-à-dire permettant l’écriture à tout le monde, et les affiche au format de la commande ls -dils (-ls).

3. Option -links 

Cette option retourne VRAI si le nombre...

Les options liées au nom 

Les options permettant de faire des recherches sur le nom des fichiers doivent être suivies d’un argument qui peut être une chaîne fixe, une expression de sélection (comme celles du shell) ou une expression régulière.

Lorsqu’il s’agit d’une expression de sélection ou d’une expression régulière, il est préférable de placer cet argument entre quotes (ou de faire précéder les métacaractères qu’elle contient d’un antislash) afin d’éviter les éventuelles interprétations de l’expression par le shell.

La première option de find relative au nom qui a existé est l’option -name.

Avec l’apparition des liens symboliques, une option a été ajoutée pour distinguer un lien symbolique du fichier vers lequel il pointe : c’est l’option -lname.

Ensuite ont été ajoutées des options permettant d’ignorer la casse des lettres, c’est-à-dire de traiter sans distinction les majuscules et les minuscules (-iname, -ilname), puis des options permettant de comparer le nom complet à une expression (-path, -regex, -wholename) ainsi que leurs équivalents permettant d’ignorer la casse des lettres (-ipath, -iregex, -iwholename). L’utilisation de certaines de ces options est maintenant déconseillée, ainsi que nous le verrons plus loin.

1. Option -name 

Cette option porte sur le nom court des fichiers au sens large et accepte les metacaractères du shell : *, ? et []. Ces derniers ont la même signification que pour le shell, à la différence qu’ils peuvent correspondre à une chaîne commençant par un ..

Les entrées . (répertoire courant) et .. (répertoire père) ne sont pas considérées comme des résultats de recherche valides par la commande find, et sont ignorées.

Syntaxe

-name expr 

Exemple 1

find /bin -type f -name '???' 

Cette commande permet de trouver sous le répertoire /bin tous les fichiers réguliers dont le nom est constitué de 3 caractères.

Exemple 2

find /usr/bin -type l -name '*cc*' -print 

Cette commande permet de trouver sous le répertoire /usr/bin...

Les expressions de sélection 

1. Utilisation du caractère ? 

Le métacaractère ? sert à désigner n’importe quel caractère, y compris un caractère . en début de chaîne.

2. Utilisation du caractère * 

Le métacaractère * sert à désigner n’importe quelle chaîne de caractères, y compris celles contenant un caractère . en début de chaîne, et la chaîne vide.

3. Utilisation des caractères [ et ] 

Les métacaractères [ et ] servent à désigner un caractère parmi un ensemble, avec la même syntaxe que dans le contexte de filtrage de nom de fichier vu précédemment.

Les expressions étendues 

1. Utilisation du caractère . 

Le métacaractère . dans une expression sert à désigner n’importe quel caractère.

2. Utilisation des caractères [ et ] 

Les caractères [ et ] servent à désigner un caractère quelconque parmi un ensemble spécifié sous forme d’énumération ou sous forme de plage contiguë, ou encore sous toute combinaison de ces deux possibilités.

3. Utilisation du caractère * 

Le caractère * dans une expression est un facteur de répétition qui s’applique au caractère qui le précède. Il indique que le caractère peut figurer N fois dans la chaîne, N étant positif ou nul.

4. Utilisation du caractère + 

Le caractère + dans une expression est un facteur de répétition qui s’applique au caractère qui le précède. Il indique que le caractère peut figurer N fois dans la chaîne, N étant strictement positif.

5. Utilisation du caractère ? 

Le caractère ? dans une expression sert à indiquer que le caractère ou l’expression qui le précède est optionnel, c’est-à-dire qu’il peut être présent ou absent.

6. Utilisation du caractère | 

Le caractère...

Exercices 

1. Exercice 1 

Comment afficher le nom complet des commandes de /bin et /usr/bin, dont le nom court est constitué de 4 caractères et commence par la lettre g ?

Solution

find /bin /usr/bin -name 'g???' 
/bin/gzip  
/bin/grep  
/usr/bin/gsnd  
/usr/bin/geqn  
/usr/bin/gksu  
/usr/bin/gslj  
/usr/bin/gsdj  
/usr/bin/gimp  
/usr/bin/gawk  
/usr/bin/gvpr  
/usr/bin/gitk  
/usr/bin/gsbj  
/usr/bin/gcov  
/usr/bin/gold  
/usr/bin/gslp  
/usr/bin/grog  
/usr/bin/gpic  
/usr/bin/gtbl  
/usr/bin/gpgv 

2. Exercice 2 

Comment afficher une liste des fichiers, dont le nom commence par la lettre R, et de répertoires contenus dans les répertoires de /etc dont le nom commence par rc, en affichant les noms de répertoires en début de ligne, et en faisant précéder le nom des fichiers d’une tabulation ?

Solution

find /etc/rc* \( -type d -exec echo {} \; \) -o \( -type f -name 
'R*' -exec echo "images/tab.PNG" {} \; \) 

Résultat

       /etc/rc.local 
/etc/rc0.d  
      /etc/rc0.d/README 
/etc/rc1.d  
      /etc/rc1.d/README 
/etc/rc2.d  
      /etc/rc2.d/README 
/etc/rc3.d  
      /etc/rc3.d/README  
/etc/rc4.d  
      /etc/rc4.d/README  
/etc/rc5.d  
      /etc/rc5.d/README  
/etc/rc6.d  
      /etc/rc6.d/README  
/etc/rcS.d  
      /etc/rcS.d/README 

On utilise dans cette syntaxe la propriété d’évaluation des expressions booléennes rappelée précédemment : si le fichier trouvé (au sens large) est en fait un répertoire, find exécutera la commande echo spécifiée par l’option -exec, et retournera VRAI. La seconde partie de l’expression ne sera donc pas exécutée.

En revanche, si le fichier est de type fichier régulier, la valeur de la première partie de l’expression sera FAUX, et il faudra évaluer la seconde...