Bien utiliser la commande find sous Linux

Bien utiliser la commande find sous Linux

Le commande find qui parcourt toute une arborescence de fichiers depuis un point de départ pour y trouver le(s) fichier(s) et/ou dossier(s) selon les critères que nous définissons.

Bien qu’elle ne soit pas la plus rapide, la commande find a l’avantage de pouvoir retrouver des fichiers/dossiers qui ne seraient pas encore indexé et offre également des paramètre de recherches très avancés, y compris les expressions régulières.

Structure générale de la commande find

Voici la structure générale de la commande find:

Bash
find <point_de_départ> <critère_1> [critère_2 ...]

Les arguments sont les suivants:

  • point_de_départ: le chemin à partir duquel la commande find va effectuer sa recherche.
  • critère_x: un critère à respecter pour la correspondance avec le fichier/dossier

Par exemple nous pouvons utiliser l’option -name pour spécifier le nom du fichier que nous cherchons. De ce fait, si nous voulons chercher un fichier nommé passwd dans le dossier /etc nous utiliserions la commande suivante:

Bash
find /etc -name "passwd"
Recherche simple par nom

La commande nous affiche ici deux résultats mais aussi plusieurs erreurs qui sont simplement dues au fait que l’utilisateur n’a pas les droits de lecture et/ou d’exécution sur les dossiers indiqués l’empêchant donc de les parcourir.

La commande find n’est donc pas un outil magique, elle respecte les droits et permissions des utilisateurs.

Voyons maintenant comment tirer parti de cet outil…

Utilisation de la commande find

Recherche par nom de fichier

L’utilisation la plus fréquente consiste a spécifier le nom du fichier que nous cherchons. C’est le cas du premier exemple que nosu avons vu ci-dessus.

Bash
find <point_de_départ> -name <nom>

Notez que nous pouvons aussi utiliser certains caractères spéciaux comme « jokers »:

  • * : correspond à n’importe quelle série de caractères
  • ? : correspond à n’importe quel caractère (un seul)

Ainsi nous pouvons par exemple chercher tous les fichiers dans /etc dont l’extension est .conf:

Recherche avec wildcards

L’option -name est sensible à la casse. Nous pouvons également effectuer une recherche insenseible à la casse en utilisant -iname.

Recherche par nom insensible à la casse

Recherche par type

Nous pouvons aussi effectuer une recherche sur base du type (dossier ou fichier) d’élément.

Bash
find <point_de_départ> -type <d|f>

Par exemple, pour trouver tous les répertoires qui se trouvent dans /etc:

Recherche des dossiers

Nous pouvons aussi rechercher uniquement les fichiers:

Recherche des fichiers

Recherche par taille

L’option -size permet de définir des paramètres de recherche basés sur la taille des fichiers. Elle peut également être utilisée deux fois pour définir des limites supérieure et inférieure:

Bash
find <point_de_départ> -size [+|-]<taille> [-size [+|-]<taille>]

Nous pouvons donc chercher tous les fichiers dont la taille est supérieure à 20Mo:

Recherche des fichiers dont la taille est suppérieure à 20Mo

Nous pouvons aussi chercher les fichiers dont la taille est inférieure à 100Ko:

Recherche des fichiers dont la taille est inférieure à 100ko

Ou encore chercher les fichiers dont la taille est comprise entre 2Mo et 5Mo:

recherche des fichiers dont la taille est comprise entre 2Mo et 5Mo

Recherche par date

La commande find nous permet aussi de rechercher des fichiers sur base d’une date de création, de modification ou d’accès. Les options correspondante sont les suivantes:

OptionDescription
-atimeRecherche sur base de la date du dernier accès en nombre de jours
-ctimeRecherche sur base de la date de création en nombre de jours
-mtimeRecherche sur base de la date de modification en nombre de jours
-aminRecherche sur base de la date du dernier accès en nombre de minutes
-cminRecherche sur base de la date de création en nombre de minutes
-mminRecherche sur base de la date de modification en nombre de minutes

Nous pouvons donc rechercher les fichiers modifiés il y a moins de 1 jour:

recherche des fichiers créés il y a moins de 1 jour

Ou encore rechercher les fichiers modifiés il y a plus de 5 jours:

recherche des fichiers modifiés il y a plus de 5 jour

En l’absence de signe + ou -, le nombre de jour ou de minute sera comparé avec exactitude.

Recherche par utilisateur

Moyennant l’option -user nous pouvons aussi chercher les fichiers qui appartiennent à un utilisateur donné:

Bash
find <point_de_départ> -user <utilisateur>
recherche par utilisateur

Nous pouvons aussi effectuer une recherche par uid avec l’option -uid.

Bash
find <point_de_départ> -uid <id_utilisateur>

Rechercher les éléments vides

L’option -empty nous permet de n’obtenir que les éléments vides et combinée à l’option -type, nous pouvons donc chercher soit les dossiers vides, soit les fichiers vides.

Bash
find <point_de_départ> -empty -type <f|d>

Donc si nous voulons trouver les dossiers vides dans notre répertoire personnel…

recherche des dossiers vides

Combiner les paramètres

Nous pouvons bien évidemment aussi combiner tous ces paramètres pour affiner notre recherche. Par exemple, nous pourrions chercher les fichiers (pas les dossiers) dont le nom commence par no dans le dossier /etc et dont la taille est inférieure à 5ko.

Bash
sudo find /etc -name no* -type f -size -5k
utilisation de plusieurs critères

Notez ici l’utilisation de sudo permettant d’exécuter find avec l’identité de l’utilisateur root et donc d’avoir accès à toute l’arborescence.

Exécuter une commande

Outre le fait de pouvoir rechercher des fichiers et dossiers, la commande find nous permet aussi d’exécuter une commande sur chaque résultat de la recherche. Pour cela nous devons utiliser l’option –exec:

Bash
find <point_de_départ> <critère_1> ... <critère_n> -exec <commande> {} \;

Ici nous avons les éléments suivants:

  • -exec : l’option d’exécution
  • commande : la commande à exécuter sur le fichier/dossier
  • {} : l’endroit où sera inséré le chemin du fichier
  • un espace obligatoire
  • \; : le marqueur de fin.

Pour l’illustration, voici le contenu du dossier data présent dans mon répertoire personnel. J’y ai créé une série de fichiers fictifs:

contenu du dossier

Imaginons maintenant que je veuille changer retirer les permissions d’écriture et de lecteur du groupe aux fichiers dont le nom contient 06.txt.

Bash
find ~/data -type f -name *06.txt -exec chmod g-rw {} \;

Une fois cette commande exécutée, j’obtiens le résultat suivant:

résultat

Conclusion

La commande find nous permet sans trop d’effort de rechercher efficacement et précisément des fichiers ou dossiers sur base d’une série de critères. Le temps d’exécution peut parfois être long de par le fonctionnement récursif de cette commande, mais en contrepartie elle nous permet de retrouver des fichiers qui ne sont pas indexés.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.