Sitedetout - Tutoriels informatiques

Les commandes Linux find et grep

La commande find :

Pour rechercher un fichier sous linux, il existe une commande spéciale nommée find .

comme nous l’avons vu dans les précédents tutoriels, vous pouvez utiliser la commande man pour savoir plus sur cette commande, quelles sont ses options et comment l’utiliser.

En exécutant la commande man find, vous obtiendrez les informations suivantes :

FIND(1)                  Manuel de l’utilisateur Linux                 FIND(1)

NOM
       find - Rechercher des fichiers dans une hiérarchie de répertoires

SYNOPSIS
       find [chemin...] [expression]

DESCRIPTION
       Cette  page  de  manuel documente la version GNU de find.  find parcourt les 
       arborescences de répertoires commençant en chacun des chemins mentionnés, en évaluant 
       les expressions fournies pour chaque  fichier  rencontré.   L’évaluation  de
       l’expression se fait de gauche à droite, en suivant des règles de priorité décrites 
       dans la section OPÉRATEURS, jusqu’à ce que le résultat soit connu (par exemple 
       la partie gauche vraie pour un opérateur OU ou fausse pour un opérateur ET).

       Le  premier  argument commençant par ‘-’, ‘(’, ‘)’, ‘,’, ou ‘!’  est considéré comme le
       début de l’expression, tous les arguments précédents sont des chemins à parcourir. 
       Tous les arguments ultérieurs sont  considérés  comme  le  reste  de l’expression 
       rationnelle.   de point de départ. Si aucune expression n’est fournie, find utilise 
       l’expression ‘-print’ par défaut.

       find se termine avec le code de retour 0 si tous les fichiers ont pu être examinés correctement, et supérieur  à  0  si
       une erreur s’est produite.
....
....

La commande find vous permet de retrouver des fichiers répondant aux critères que vous définissez.

Sa syntaxe est comme suit :

find répertoire critères

Le répertoire est le chemin sur lequel la recherche est exécutée.

les critères sont une suite d’expressions permettant d’affiner la recherche, les plus utilisés sont les suivants :

  • -name : filtrer par rapport au nom du fichier
  • -type : filtrer par rapport au type du fichier
  • -size : filtrer par rapport à la taille du fichier
  • -ctime : filtrer par rapport à la date de création du fichier
  • -atime : filtrer par rapport à la dernière date d’accès au fichier
  • -mtime : filtrer par rapport à la dernière date de modification du fichier
  • -user : filtrer par rapport au propriétaire du fichier
  • -group : filtrer par rapport au groupe du fichier
  • -perm : filtrer par rapport au permission du fichier

Exemples :

1- Trouver les fichiers fichier1 et fichier2 dans le répertoire /tmp :

[root@centos ~]# touch /tmp/fichier1
[root@centos ~]# touch /tmp/fichier2
[root@centos ~]# touch /tmp/testfichier1
[root@centos ~]# find /tmp -name fichier1 /tmp/fichier1 
[root@centos ~]# find /tmp/ -name fich* 
/tmp/fichier2 
/tmp/fichier1

2- Trouver les fichiers dont le nom commence par “fich” ou par “test” dans le répertoire /tmp :

[root@centos ~]# find /tmp \( -name 'fich*' -o -name 'test*' \)
/tmp/fichier2
/tmp/testfichier1
/tmp/fichier1

On vient de créer deux fichiers : fichier1 et fichier2 dans le répertoire /tmp, ensuite chercher à l’aide de la commande find fichier1 puis les fichiers commançant par fich (fich*) disponible sous le répertoire /tmp.

3- Trouver tout les fichiers dans le répertoire /tmp :

[root@centos ~]# find /tmp -type f
/tmp/fichier2
/tmp/.X0-lock
/tmp/fichier1
/tmp/.X2-lock

A l’aide de l’option –type f, on a pu lister l’ensemble des fichiers disponibles dans le répertoire /tmp notemment fichier1 et fichier2 qu’on vient de créer dans l’exemple précédent. Pour rechercher des répertoires, utilisez l’option -type d (d pour directory).

[root@centos ~]# ls -l /tmp
total 48
-rw-r--r--. 1 root root 0 14 mai 21:32 fichier1
-rw-r--r--. 1 root root 0 14 mai 21:32 fichier2
...

Les deux fichiers qu’on a créé sont encore vides (taille 0 ko noté en rouge), on va écrire du contenu dans fichier1 comme suit :

[root@centos ~]# echo "contenu" > /tmp/fichier1
[root@centos ~]# ls -l /tmp
total 52
-rw-r--r--. 1 root root 8 14 mai 21:51 fichier1
-rw-r--r--. 1 root root 0 14 mai 21:32 fichier2
...

4- Lister les fichiers disponibles sous /tmp et dont la taille est supérieure à 0 ko

[root@centos ~]# find /tmp -type f -size +0k
/tmp/fichier2

5- Trouver les fichiers vides. On utilisera pour cela, l’option -empty :

[root@centos ~]# find /tmp -type f -empty
/tmp/fichier2

Les deux fichiers fichier1 et fichier2 appartiennent à l’utilisateur root et le groupe root, donc on peut solliciter ces deux informations.

6- Trouver les fichiers appartenant à l’utilisateur root et le groupe root :

[root@centos ~]# find /tmp -type f -user root -group root
/tmp/fichier2
/tmp/fichier1
...

Réprenons le résultat de ls précédent :

[root@centos ~]# ls -l /tmp
total 48
-rw-r--r--. 1 root root 0 14 mai 21:32 fichier1
-rw-r--r--. 1 root root 0 14 mai 21:32 fichier2
...

Les deux fichiers ont été créés avec les permissions rw-r–r– ce qui équivaut à 644

7-Trouver les fichiers disponibles sous /tmp et dont les permission sont 644 :

[root@centos ~]# find /tmp -type f -perm 644
/tmp/fichier2
/tmp/fichier1
...

On peut voir aussi à travers le résultat de ls que les deux fichiers fichier1 et fichier2 ont été modifié le 14 mai à 21:32.

8- Trouver les fichiers dont la date de modification est antérieure à 2 jours et 10 jours :

[root@centos ~]# date
dim. mai 21 14:45:39 CEST 2017

A travers la commande date, on peut connaitre la date actuelle.
Donc, on est le 21 mai et ainsi, presque 7 jours nous séparent de la dernière date
de modification des deux fichiers.

[root@centos ~]# find /tmp -type f -mtime +2
/tmp/fichier2
/tmp/fichier1
...

On vient de lister les fichiers disponible sous /tmp et dont la dernière date de modification dépasse 2 jours.

Si on essaye de faire la même chose pour 10 jours, les deux fichiers ne seront pas listés.

[root@localhost oracle]# find /tmp -type f -mtime +10
...

L’option -exec :

On vient de tester la commande find en utilisant plusieurs options pour retourner le résultat souhaité.

Maintenant, ce qui serait intéressant à faire est de solliciter la liste des résultats et l’afficher différemment ou lui apporter quelques modifications.

Ceci est possible grâce à l’option -exec.

1- Trouver les fichiers sous /tmp et afficher le résultat en format long :

[root@localhost oracle]# find /tmp -type f -exec ls -l {} \;
-rw-r--r--. 1 root root 0 14 mai 21:32 /tmp/fichier2
-rw-r--r--. 1 root root 8 14 mai 21:51 /tmp/fichier1
...

2- Trouver les fichiers disponible sous /tmp dont le permissions sont 644 et changer leurs 
permissions en 777 (rwxrwxrwx):
[root@localhost oracle]# find /tmp -type f -exec chmod 777 {} \;
[root@localhost oracle]# find /tmp -type f -exec ls -l {} \;
-rwxrwxrwx. 1 root root 0 14 mai 21:32 /tmp/fichier2
-rwxrwxrwx. 1 root root 8 14 mai 21:51 /tmp/fichier1
...

La commande grep :

La commande grep permet de lister (dans un fichier ou une entrée standard) les lignes correspondantes à un motif donné (mot, phrase, caractère …)

Sa syntaxe est comme suit :

grep options fichiers

les critères les plus utilisés sont les suivants :

  • -n : Afficher le numéro des lignes retournées
  • -i : Ignorer la casse (majuscule/minuscule) dans la recherche
  • -c : Afficher le nombre de lignes retournées
  • -v : Afficher toutes les lignes ne contenant pas le motif
  • -r : Rechercher récursivement dans un répertoire
  • -e : Motif de recherche

La commande grep profite aussi de la puissance des expressions régulières pour effectuer la recherche, ainsi :

La commande grep [0–9]  /etc/passwd retournera l’ensemble des lignes contenant un numéro dans le fichier /etc/passwd. Voici quelques expressions régulières utiles :

  • [a-z]+ : Afficher les lignes contenant au minimum une lettre minuscule
  • [A-Z]+ : Afficher les lignes contenant au minimum une lettre majuscule
  • :[0-9]\{3,\} : Afficher les lignes contenant un numéro de trois chiffres précédé par un “:”
  • un (numéro|nombre) spéciale : Afficher toutes les lignes contenant les motifs “un numéro spéciale” ou “un nombre spéciale

Exemples :

1- Afficher les lignes contenant le mot sitedetout dans le fichier /tmp/fichier1

[root@localhost oracle]# echo "tutoriel linux sitedetout" > /tmp/fichier1 
[root@localhost oracle]# echo "Vous suivez un tutoriel de la commande grep dans le site web sitedetout.com" >> /tmp/fichier1 
[root@localhost oracle]# grep sitedetout /tmp/fichier1
tutoriel linux sitedetout
Vous suivez un tutoriel de la commande grep dans le site web sitedetout.com

2- Afficher les lignes finissant par le mot sitedetout.com dans le fichier /tmp/fichier1

[root@localhost oracle]# grep "sitedetout.com$" /tmp/fichier1
Vous suivez un tutoriel de la commande grep dans le site web sitedetout.com

3-Trouver le motif “sitedetout” dans l’ensemble du répertoire /tmp

[root@localhost oracle]# grep -rnw /tmp -e "sitedetout"
/tmp/fichier1:1:tutoriel linux sitedetout
/tmp/fichier1:2:Vous suivez un tutoriel de la commande grep dans le site web sitedetout.com

La commande précédente permet de chercher récursivement (r) dans le répertoire /tmp
et retourner les lignes contenant le mot entier (w) sitedetout en affichant le numéro de chaque
ligne retournée (n).

Les commandes find et grep peuvent être combinés pour un besoin précis comme :

4- Trouver les fichiers disponibles sous /tmp dont le nom commence par “fich” et retourner
les lignes contenant le motif “sitedetout”

[root@localhost oracle]# find /tmp -name fich* -exec grep "sitedetout" {} \;
tutoriel linux sitedetout
Vous suivez un tutoriel de la commande grep dans le site web sitedetout.com


Commentaires de Les commandes Linux find et grep

  • bonjour

    je suis intéressé à maîtriser l’environnement linux (administration et programmation Shell)
    merci d’avance

    Cdt
    Hakim

    hakim EL-ARRASSI 5 octobre 2019 14 h 45 min Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Menu Title
Chargement...

Powered by sitedetout.com