2006 - aujourd'hui (MCF) > Résumé Grep, Find, caractères génériques

Caractères génériques et expressions régulières

  • Que faire si vous oubliez le nom du fichier que vous cherchez ? Grâce aux caractères génériques et aux expressions régulières, il est possible d'agir sur un ou plusieurs fichiers sans en connaître le nom complet. Il suffit de saisir les caractères que vous connaissez et de remplacer les autres par un caractère générique. Cela permet aussi de travailler de manière générique sur des ensembles de fichiers, pour le coté pratique.
  • Astuce : Pour en savoir plus sur les caractères génériques et les expressions régulières, consultez la page de manuel bash (man bash). N'oubliez pas que vous pouvez enregistrer le fichier sous la forme d'un fichier texte en entrant man bash | col -b > bash.txt. Ensuite, vous pouvez l'ouvrir et le lire à l'aide de less ou de pico (pico bash.txt). Si vous voulez imprimer le fichier, rappelez-vous que cela peut être assez long.
  • Par exemple, nous savons que le fichier s'appelle "sneak____.txt". Entrez tout simplement :
    ls sneak*.txt et le nom du fichier s'affiche : sneakers.txt
  • Il est probable que vous utiliserez très fréquemment l'astérisque (*) pour effectuer de telles recherches. L'astérisque correspond a une chaine contenant un nombre quelconque de caracteres quelconques. Donc *.txt signifie n'importe quel fichier terminant par .txt. Vous pouvez donc même entrer
    ls *.txt ou : ls sn*
  • Vous trouverez également sneakers.txt ou tout autre fichier commençant par sn ou finissant par .txt. Très pratique pour limiter la recherche au minimum. Une façon de limiter la recherche consiste à utiliser le point d'interrogation (?). Tout comme l'astérisque, le signe ? peut vous aider à trouver un fichier correspondant à un certain modèle de recherche. Dans ce cas, cependant, le signe ? permet de remplacer un seul caractère ; ainsi, si vous recherchez sneaker?.txt, vous trouverez sneakers.txt, de même que sneakerz.txt, s'il existe un fichier de ce nom. Les expressions régulières sont plus complexes que l'astérisque ou le point d'interrogation. Si un astérisque, par exemple, fait partie du nom du fichier, comme ce serait le cas si le fichier sneakers.txt s'appelait plutôt sneak*.txt, les expressions régulières s'avèrent utiles. La barre oblique inverse (\) permet de spécifier que vous ne voulez pas rechercher tout ce que remplace l'astérisque, mais plutôt un fichier dont le nom contient un astérisque. Si le fichier s'appelle sneak*.txt, entrez :
    sneak\*.txt

La commande head

  • Vous pouvez utiliser la commande head si vous désirez visualiser le début d'un fichier. Par défaut, seules les dix premières lignes peuvent être lues. La commande est :
    head <nom-du-fichier>
  • La commande head peut être utile : vous pouvez modifier ce nombre au moyen de la commande suivante : head -20 <nom-du-fichier> ou head -n 24 <nom-du-fichier>

La commande tail

  • Le contraire de la commande head est la commande tail. Grâce à tail, vous pouvez visualiser les dix dernières lignes d'un fichier :
    tail <nom-du-fichier>
  • Vous pouvez modifier ce nombre au moyen de la commande suivante :
    tail -42 <nom-du-fichier>ou tail -n 28 <nom-du-fichier>

La commande grep

  • La commande grep est utile pour trouver une chaîne de caractères spécifiques dans un fichier. Par exemple, si vous désirez trouver toutes les références au mot "coffee" dans le fichier sneakers.txt, vous entrez :
    grep coffee sneakers.txt
  • Toutes les lignes où le mot "coffee" apparaît vous sont alors affichées.
  • Astuce
    • Sauf spécification contraire, les recherches de grep sont sensibles à la casse. Donc, la recherche du mot Coffee est différente de la recherche du mot coffee. C'est pourquoi une des options de grep, -i, permet de faire la recherche de mots dans un fichier sans tenir compte de la casse. Reportez-vous à la page man grep pour avoir plus d'informations sur cette commande.
  • Dans le cas le plus simple, grep est utilisé pour afficher les lignes contenant un certain mot. Pour chercher les lignes contenant le nom Durand dans un fichier de contact téléphonique :
    grep Durand ListeNuméros.txt
    qui retournera seulement les lignes contenant Durand :
    Mathieu Durand, 0723237694
    Bernard Durand, 0966324355
    Pour chercher la chaine plop dans tous les fichiers du répertoire courant :
    grep plop *
    Pour chercher la chaine plop dans tous les fichiers du répertoire courant ainsi que dans les sous-répertoires (le caractère . est un chemin relatif qui désigne le répertoire courant) :
    grep -r plop .
    Idem recherche précédente, mais en ne retournant que les noms des fichiers qui contiennent plop :
    grep -lr plop .

La commande find

  • La commande find permet de retrouver des fichiers à partir de certains critères. La syntaxe est la suivante :
    find <répertoire de recherche> <critères de recherche>
    Les critères de recherche sont les suivants :
    -name recherche sur le nom du fichier,
    -perm recherche sur les droits d'accès du fichier,
    -links recherche sur le nombre de liens du fichier,
    -user recherche sur le propriétaire du fichier,
    -group recherche sur le groupe auquel appartient le fichier,
    -type recherche sur le type (d=répertoire, c=caractère, f=fichier normal),
    -size recherche sur la taille du fichier en nombre de blocs (1 bloc=512octets),
    -atime recherche par date de dernier accès en lecture du fichier,
    -mtime recherche par date de dernière modification du fichier,
    -ctime recherche par date de création du fichier.
    On peut combiner les critères avec des opérateurs logiques :
    critère1 critère2 ou critère1 -a critère2 correspond au et logique,
    !critère non logique,
    \ (critère1 -o critère2\) ou logique,
  • La commande find doit être utilisée avec l'option -print. Sans l'utilisation de cette option, même en cas de réussite dans la recherche, find n'affiche rien à la sortie standard (l'écran, plus précisément le shell).
  • La commande find est récursive, c'est à dire où que vous tapiez, elle va aller scruter dans les répertoires, et les sous répertoires qu'il contient, et ainsi de suite.
  • Recherche par nom de fichier :
    • Pour chercher un fichier dont le nom contient la chaîne de caractères toto à partir du répertoire /usr, vous devez tapez :
      find /usr -name "*toto*" -print
    • Pour chercher un fichier dont le nom est toto à partir du répertoire /usr, vous devez tapez :
      find /usr -name "toto" -print En cas de réussite, si le(s) fichier(s) existe(nt), vous aurez comme sortie :
      toto
      En cas d'échec, vous n'avez rien.
    • Pour rechercher tous les fichiers se terminant par .c dans le répertoire /usr, vous taperez :
      find /usr -name " *.c " -print
      Vous obtenez toute la liste des fichiers se terminant par .c sous les répertoires contenus dans /usr (et dans /usr lui même).
  • Recherche suivant la date de dernière modification :
    • Pour connaître les derniers fichiers modifiés dans les 3 derniers jours dans toute l'arborescence (/), vous devez taper :
      find / -mtime 3 -print
  • Recherche combinée :
    • Pour connaître dans toute l'arborescence, les fichiers dont la taille dépasse 1Mo (2000 blocs de 512Ko), vous devez taper :
      find / -size 2000 -print
  • Recherche suivant la taille :
    • Vous pouvez chercher dans toute l'arborescence, les fichiers ordinaires appartenant à olivier, dont la permission est fixée à 755, on obtient :
      find / -type f -user olivier -perm 755 -print
  • Redirection des messages d'erreur :
    • Vous vous rendrez compte assez rapidement qu'en tant que simple utilisateur, vous n'avez pas forcément le droit d'accès à un certain nombre de répertoires, par conséquent, la commande find peut générer beaucoup de messages d'erreur (du genre permission denied), qui pourraient noyer l'information utile. Pour éviter ceci, vous pouvez rediriger les messages d'erreur dans un fichier poubelle (comme /dev/null), les messages d'erreur sont alors perdus (rien ne vous empêche de les sauvegarder dans un fichier, mais ça n'a aucune utilité avec la commande find).
      find . -name bobo -print
      find . -name "*release*" 2>/dev/null
    • Si vous voulez connaître les fichiers n'appartenant pas à l'utilisateur olivier, vous taperez :
      find . ! -user olivier -print ! -user olivier, est la négation de -user olivier, c'est à dire c'est tous les utilisateurs sauf olivier.
    • Recherche des fichiers qui ont pour nom a.out et des fichiers se terminant par .c. On tape :
      find . \ ( -name a.out -o -name " *.c " \ ) -print On recherche donc les fichiers dont le nom est a.out ou les fichiers se terminant par *.c, une condition ou l'autre.
    • Recherche des fichiers qui obéissent à la fois à la condition a pour nom core et à la condition a une taille supérieure à 1Mo.
      find . \ (-name core -a size +2000 \ ) -print
  • Utilisé avec la commande find, on obtient un outil de recherche performant, permettant par exemple trouver tous les fichiers correspondants à un masque contenant une chaine de caractères bien précise :
    find /usr/src/linux -name "*.[ch]" -exec grep -li "foobar" {} \; /usr/src/linux : nom du dossier où l'on cherche
    -name "*.[ch]" : nom du fichier
    -exec grep -li "foobar" {} \; : on dit à find d'exécuter la commande qui suit sur chacun des fichiers qu'elle trouve ({} représente le(s) fichier(s) trouvé(s)).
  • Les commandes en option
    • L'option -print est une commande que l'on passe à find pour afficher les résultats à la sortie standard. En dehors de print, on dispose de l'option -exec. find couplé avec exec permet d'exécuter une commande sur les fichiers trouvés d'après les critères de recherche fixés. Cette option attend comme argument une commande, celle ci doit être suivi de {}\ ;.
    • Exemple recherche des fichiers ayant pour nom core, suivi de l'effacement de ces fichiers.
      find . -name core -exec rm {}\ ;
    • Tous les fichiers ayant pour nom core seront détruits, pour avoir une demande de confirmation avant l'exécution de rm, vous pouvez taper :
      find . -name core -ok rm {}\ ;
  • Autres subtilités
    • Une fonction intéressante de find est de pouvoir être utilisé avec d'autres commandes Unix. Par exemple :
      find . -type f -print | xargs grep toto En tapant cette commande vous allez rechercher dans le répertoire courant tous les fichiers normaux (sans les répertoires, fichiers spéciaux), et rechercher dans ces fichiers tous ceux contenant la chaîne toto.