Next Previous Contents

11. Les commandes grep et find

11.1 Les expressions régulières

On a vu auparavant ce qu'étaient les métacaractères. Les expressions régulières sont aussi des suites de caractères permettant de faire des sélections. Elles fonctionnent avec certaines commandes comme grep.

Les différentes expressions régulières sont :

Exemple l'expression [a-z][a-z] * cherche les lignes contenant au minimum un caractère en minuscule. [a-z] caractère permis, [a-z]* recherche d'occurrence des lettres permises.

L'expression [0-9]\ {4\}$ a pour signification, du début à la fin du fichier $, recherche les nombres[0-9] de 4 chiffres \ {4\}.

11.2 La commande grep

La commande grep permet de rechercher une chaîne de caractères dans un fichier. Les options sont les suivantes :

Exemple avec le fichier carnet-adresse :

olivier:29:0298333242:Brest  
marcel:13:0466342233:Gardagnes  
myriam:30:0434214452:Nimes  
yvonne:92:013344433:Palaiseau  
 

On peut utiliser les expressions régulières avec grep. Si on tape la commande :

grep ^[a-d] carnet-adresse  
 

On va obtenir tous les lignes commençant par les caractères compris entre a et d. Dans notre exemple, on n'en a pas, d'où l'absence de sortie.

grep Brest carnet-adresse  
 

Permet d'obtenir les lignes contenant la chaîne de caractère Brest, soit :

olivier:29:0298333242:Brest  
 

Il existe aussi les commandes fgrep et egrep équivalentes.

11.3 La commande find

Présentation

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 :

On peut combiner les critères avec des opérateurs logiques :

La commande find doit être utilisé 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, il 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  
 

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 suivant la taille

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 combinée

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  
 

Recherche en utilisant les opérateurs logiques

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  
 

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.


Next Previous Contents