Recherches avec la commande find

Table des matières

  1. Introduction
  2. Actions sur le résultat
    1. xargs
    2. -exec
    3. Exemples
      1. Recherche d’une expression
      2. Recherche dans des fichiers jar
  3. Sources

Introduction

La commande find permet de chercher des fichiers et éventuellement d’effectuer une action sur les résultats recherche. Bien que sa syntaxe est quelque peu complexe, il n’en demeure pas moins qu’elle est très puissante et souple.

Dans les lignes qui suivent je n’ai pas pour prétention d’expliquer le fonctionnement de la commande find mais plutôt de donner quelques astuces afin de vous simplifier la vie lors d’une recherche.

find cherche de manière récursive les fichiers qui correspondent aux critères définis: nom (name), propriétaire (owner), groupe (group), type (type), autorisations (permissions), taille (size), etc.

Syntaxe:
find [where] [criteria]
Tip Par défaut, le contenu d’un répertoire lié symboliquement n’est pas traité. Pour y remédier, il faut ajouter l’option ‘-L’.

Actions sur le résultat

Il existe deux moyens d’exploiter le résultat d’une recherche soit via la commande xargs, soit via l’option -exec, toutes deux ayants certains avantages et inconvénients.

xargs

Syntaxe de base:
find [where] [criteria] | xargs [command]

xargs divise les arguments reçus en paramètre avec des espaces ou des retour-chariots. Si un nom de fichier (ou de chemin) contient des espaces par exemple “mon document.odt”, xargs va interpréter “mon” et “document.odt” comme étant deux fichiers distincts.

La solution pour éviter ce problème consiste à ajouter le paramètre ‘-0‘ à la commande xargs et ‘-print0‘ comme dernier argument de la commande find. Ainsi les espaces de fin de chaînes sont remplacés par null au lieu de blanc.

De plus, dans le cas où le résultat de la commande find est vide, xargs ne mettra pas fin au traitement et tentera d’exécuter la commande cible ce qui peut occasionner une erreur dans le traitement de cette dernière. Pour éviter ce cas de bord on ajoutera l’option ‘-r‘ à la commande xargs.

Syntaxe adaptée:
find [where] [criteria] -print0 | xargs -0 -r [command]

Avantages

  • Le traitement des résultats est plus efficace qu’avec l’option -exec
  • Le résultat de la commande xargs peut être réutilisée avec un pipe (|)

-exec

Syntaxe:
find [where] [criteria] -exec [command] {} \;

L’option -exec (à ne pas confondre avec la commande shell exec) exécute la commande sur chaque fichier trouvé répondant aux critères de recherche.

La paire d’accolade est automatiquement remplacée par le nom du fichier. Si le nom du fichier contient des caractères spéciaux, le shell tentera de les interpréter. Pour éviter cette interprétation, les accolades doivent être entourées d’apostrophes ('{}') ou de guillemets ("{}").

De plus, l’instruction à exécuter (ou commande) doit être terminée par les caractères \; (ou ';') précédé d’un espace.

Exemples

Il est parfois nécessaire de pouvoir rechercher une chaîne de caractères dans une série de fichiers.

Les commandes suivantes effectuent cette recherche depuis le répertoire courant de manière récursive et affiche le résultat dans la console. L’une utilise la commande xargs, l’autre l’option -exec mais au final le résutlat sera identique.

Syntaxe:
find . -name '[file_pattern]' -print0 | xargs -0 -r grep --color '[string]'
ou
find . -name '[file_pattern]' -exec grep --color '[string]' '{}' \; -print
$ find . -name '*.txt' -print0 | xargs -0 -r grep --color 'linux'
ou
$ find . -name '*.txt' -exec grep --color 'linux' '{}' \; -print

Ci-après la commande find affiche le contenu de tous les fichiers jar depuis le répertoire courant.

$ find -name '*.jar' -exec jar tvf '{}' \;

Bien entendu, le résultat obtenu peut être redirigé avec un PIPE (|) vers une autre commande. Ainsi l’utilisation de grep permet de filtrer la sortie.

Ici, seuls les fichiers .xml contenus dans les jar seront affichés:

$ find -name '*.jar' -exec jar tvf '{}' \; | grep --color '.xml'
Tip L’option --color utilisée avec la commande grep n’est pas obligatoire. Toutefois elle mets en valeur les résultats de la recherche ce qui simplifie la lecture.

Sources

This entry was posted in Bash, Development, GNU/Linux and tagged , , , . Bookmark the permalink. Follow any comments here with the RSS feed for this post.

Leave a Reply

Your email address will not be published. Required fields are marked *