Commande find sous Linux : rechercher et trouver des fichiers

Linux est un système d’exploitation open source qui a été créé comme une alternative gratuite à UNIX. Comme avec UNIX, la ligne de commande est un outil fondamental lorsque vous travaillez avec Linux. L’utilisateur entre les commandes dans une ligne de commande qui les exécute.

La commande find sous Linux est utilisée pour rechercher des fichiers. Elle lance une recherche récursive dans laquelle un ou plusieurs répertoires sont explorés selon certains critères. La commande find Linux est un outil précis pour rechercher fichiers et répertoires et est prise en charge sur presque toutes les distributions Linux.

Conseil

Optez pour l’hébergement Linux de IONOS, créez un lieu sûr pour vos projets Web.

Aperçu de la commande find sous Linux

La commande find est déclenchée directement par le biais d’une ligne de commande dans le terminal ou la console. Voici la syntaxe générale de la commande find sous Linux :

find <chemin> <option>
Note

Attention : soyez prudent lors de l’entrée de commandes dans le terminal ou la console. L’exécution d’une mauvaise commande peut, dans certains cas, endommager votre système !

On trouve d’abord la commande elle-même, suivie du chemin d’accès au répertoire et d’un nombre variable d’options de recherche. Une option de recherche est composée d’un trait d’union immédiatement suivi du nom de l’option. Celui-ci est suivi d’un espace et de la valeur de l’option. Voici un aperçu des options de recherche les plus fréquemment utilisées :

Options

Significations

-name, -iname

Recherche par nom de fichier

-type

Recherche par type de fichier

-size, -empty

Recherche par taille de fichier

-ctime, -mtime, -atime

Recherche par date de création, date de dernière modification ou date de dernier accès

-user, -group

Recherche par propriétaire ou par groupe

-perm

Recherche par autorisations d’accès

Plusieurs options de recherche peuvent être combinées. Une opération AND (et) est implicitement supposée lorsque plusieurs options sont utilisées. Elle peut également être écrite. De plus, un lien OR (ou) peut être utilisé et une condition peut être annulée :

Options

Significations

-and

Les résultats de la recherche doivent remplir les deux conditions

-or

Les résultats de la recherche doivent correspondre à au moins l’une des deux conditions

-not

Ignore la condition suivante

Notez que dans les exemples de code suivants, vous devez remplacer les <termes génériques> par des valeurs réelles afin d’exécuter les exemples.

Limiter la recherche à un répertoire spécifique

Voyons d’abord comment limiter la recherche à un répertoire spécifique. Pour rechercher dans le répertoire courant, on utilise le point « . » comme chemin d’accès au répertoire :

find . <option>

Pour rechercher dans son répertoire personnel, on utilise le tilde « ~ » comme chemin d’accès au répertoire :

find ~ <option>

Vous pouvez également rechercher l’ensemble du système à l’aide de find sous Linux. Cependant, en raison du grand nombre de fichiers et éventuellement de répertoires, cela peut prendre beaucoup de temps. Pour rechercher dans tout le système, on utilise la barre oblique « / » comme chemin d’accès au répertoire :

find / <option>
Note

Attention : soyez extrêmement prudent lorsque vous utilisez la commande find Linux en combinaison avec l’option « -exec » sur l’ensemble du système !

Personnaliser les résultats de la recherche

Les résultats de recherche de la commande find Linux peuvent être très longs. Il est donc souvent utile de paramétrer la présentation des résultats. On n’utilise alors pas les options de la commande pour cela, mais ce que l’on appelle des « tubes » (ou « pipelines » ou « pipes »). Sous Linux, ceux-ci sont utilisés pour utiliser la sortie d’une commande comme entrée d’une autre commande.

Pour afficher les résultats par page, on transmet la sortie de la commande find à la commande less :

find <chemin> <option> | less

Pour compter le nombre de résultats, on transmet la sortie de la commande find à la commande wc avec l’option « -l »:

find <chemin> <option> | wc -l

Afin de ne sortir que les premiers ou les derniers résultats de recherche, on transmet la sortie de la commande find aux commandes « head » et « tail ». On entre le paramètre « -n » suivi du nombre de résultats de recherche souhaité :

find <chemin> <option> | head -n <nombre>
find <chemin> <option> | tail -n <nombre>

Rechercher des fichiers sur Linux : cas d’utilisation simples

Les exemples suivants limitent la recherche au répertoire courant et toute sa descendance. Utilisez la commande cd sur la ligne de commande pour accéder à n’importe quel répertoire. Pour essayer simplement les exemples, accédez d’abord à votre dossier utilisateur :

cd ~

Filtrer par nom de fichier avec la commande find Linux

Pour filtrer par nom de fichier, utilisez l’option « -name ». Le nom de fichier doit être exact et la casse respectée :

find . -name <fichier>

Ici, on recherche un fichier avec le nom exact « .gitignore » :

find . -name .gitignore

Pour ignorer la différence entre les majuscules et les minuscules, on utilise l’option « -iname ». Le « i » signifie « insensible », pour « insensible à la casse », c’est à dire qui ne tient pas compte des majuscules et minuscules :

find . -iname <fichier>

Il est généralement plus pratique deffectuer dabord une recherche insensible à la casse et de n’utiliser l’option « -name » que si la recherche avec « -iname » renvoie à trop de résultats.

Pour effectuer une recherche non pas à partir d’un nom de fichier exact mais une partie du nom seulement, on utilise lastérisque pour remplacer les parties manquantes et on écrit la recherche entre guillemets. L’astérisque permet de remplacer tout texte manquant. Ici, on recherche des fichiers et des répertoires dont les noms contiennent le texte « git » :

find . -iname "*git*"

Filtrer par type de fichier à l’aide de la commande find Linux

Un aspect célèbre de la philosophie UNIX est le principe selon lequel « tout est un fichier ». C’est aussi valable sous Linux. Le terme « fichier » est défini de manière plus large que dans l’usage courant. Ainsi, les répertoires sont également considérés comme des fichiers sous Linux. Pour éviter toute confusion, le terme plus précis de « descripteur de fichier » est parfois utilisé.

Lorsqu’on parle de « type de fichier » sous Linux, il ne s’agit pas de faire la différence entre un fichier Excel ou une image JPEG. Il s’agit plutôt de distinguer les différents types de descripteurs de fichiers qui existent sous Linux. La commande Linux find fournit l’option de recherche « -type » pour filtrer les différents types de fichiers. On peut donc faire la distinction entre les fichiers et les répertoires lors de la recherche. Voici un aperçu des types de fichiers les plus couramment utilisés :

Types de fichier

Significations

f

Fichier („file“)

d

Répertoire („directory“)

l

Lien symbolique („symlink“)

Pour ninclure que les fichiers dans les résultats de la recherche, on utilise l’option « -type » suivie de la valeur « f »:

find . -type f

Pour ninclure que les répertoires dans les résultats de la recherche, on utilise l’option « -type » suivie de la valeur « d »:

find . -type d

Pour filtrer les extensions de fichiers, on utilise l’option « -iname » et l’astérisque comme terme générique.

Pour trouver tous les fichiers avec l’extension jpeg ou JPEG :

find . -type f -iname "*.jpeg"

Pour trouver tous les fichiers avec l’extension jpeg/JPEG ou jpg/JPG :

find . -type f -iname "*.jpeg" -or -iname "*.jpg"

Filtrer par taille à l’aide de find sous Linux

Un fichier sous Linux contient plusieurs informations. Cela comprend généralement au moins les éléments suivants :

  • Le nom
  • Le type de fichier
  • La taille
  • Les dates de création ou de dernière modification
  • Le propriétaire ou le groupe
  • Les droits d’accès

Tous ces éléments peuvent être filtrés avec la commande find et les options correspondantes. Pour filtrer selon la taille dun fichier, on utilise l’option « -size » suivie d’une spécification de la taille.

La commande find suivante renvoie tous les fichiers d’une taille d’au moins 700 mégaoctets :

find . -size +700M
Note

Le filtrage par taille ne fonctionne que pour les fichiers. Aucune taille n’est stockée dans le système de fichiers pour les répertoires. À la place, la taille est calculée de manière récursive si nécessaire.

Les informations sur la taille dun fichier sont affichées avec un nombre suivi dune unité. Voici un aperçu des unités disponibles :

Unités

Significations

c

Octets

k

Kilooctets

M

Mégaoctets

G

Gigaoctets

b

Blocs de 512 octets

Ces informations correspondent à la taille exacte du fichier. C’est peu pratique car la taille exacte du fichier recherché est souvent inconnue. Rechercher selon un ordre de grandeur fait plus sens. Pour cela, le numéro est précédé d’un signe modificateur :

Modificateurs

Significations

+

Le fichier est plus grand que la taille spécifiée

-

Le fichier est plus petit que la taille spécifiée

La commande suivante renvoie des fichiers inférieurs à 500 mégaoctets :

find . -size -500M

La commande suivante renvoie des fichiers d’une taille comprise entre 400 et 500 mégaoctets :

find . -size +400M -and -size -500M

En plus de spécifier une taille exacte ou selon un ordre de grandeur, il est possible de rechercher des fichiers vides avec l’option « -empty » :

find . -type f -empty

Cette option fonctionne également pour les répertoires :

find . -type d -empty

Filtrer par dates avec la commande Linux find

Le système d’exploitation gère le système de données et enregistre l’accès aux fichiers. Différentes informations sur les moments de création et de modification des fichiers sont enregistrées. Linux enregistre les heures et dates de création, de la dernière modification et du dernier accès à un fichier. Avec la commande find sous Linux, il est possible de filtrer ces informations. Voici un aperçu des options de recherche les plus fréquemment utilisées :

Options

Significations

-ctime, -cmin

Filtrer par date de création („Creation“)

-mtime, -mmin

Filtrer par date de modification („Modification“)

-atime, -amin

Filtrer par date de dernier accès au fichier („Access“)

Pour trouver les fichiers qui ont été modifiés il y a un jour, on utilise l’option de recherche « -mtime », suivie de la valeur « 1 »:

find . -type f -mtime 1

Les options de recherche contenant « time » correspondent au nombre de jours. Les options avec « min » indiquent un nombre de minutes.

De la même manière que le filtrage par taille de fichier, il est possible d’indiquer un ordre de grandeur pour les dates. Encore une fois, les signes plus et moins sont utilisés comme modificateurs :

Modificateurs

Significations

+

La date renvoie à plus de jours que le chiffre indiqué

-

La date renvoie à moins de jours que le chiffre indiqué

Pour trouver les fichiers créés il y a plus de 100 jours, on utilise l’option de recherche « -ctime », suivie de la valeur « +100 » :

find . -type f -ctime +100

Comme pour le filtrage par taille de fichier, les options de recherche peuvent être combinées pour couvrir une fourchette de dates. Pour trouver les fichiers qui ont été consultés il y a trois à cinq jours, on utilise l’option de recherche « -atime » deux fois, chacun avec les valeurs « +2 » et « -6 ». L’option « -and » est explicite et donc facultative :

find . -type f -atime +2 -and -atime -6

Pour trouver les fichiers qui ont été modifiés il y a moins de cinq minutes, on utilise l’option de recherche « -mmin » avec la valeur « -5 » :

find . -type f -mmin -5

Filtrer par propriétaire, groupe et droits d’accès avec la commande Linux find

Sous Linux, chaque fichier se voit attribuer un utilisateur propriétaire. De plus, chaque fichier appartient à un groupe d’utilisateurs spécifique. Sur cette base, certaines autorisations sont définies pour chaque fichier. Il est possible de filtrer avec la commande find pour trouver des fichiers sous Linux selon toutes ces informations. Voici un aperçu des options de recherche utilisées :

Options

Significations

-user

Filtrer par propriétaire

-group

Filtrer par groupe

-perm

Filtrer par droits d’accès

Pour rechercher des fichiers appartenant à lutilisateur root (ou super utilisateur), on utilise l’option de recherche « -user » suivie de la valeur « root » :

find . -user root

Pour rechercher des fichiers appartenant à l’utilisateur qui est en train de faire la recherche, on utilise l’option de recherche « -user » suivie de l’expression « $ (whoami) ». Ce terme générique correspond au nom de l’utilisateur connecté :

find . -user $(whoami)

Pour rechercher des fichiers appartenant au groupe administrateur, on utilise l’option de recherche « -group » suivie de la valeur « admin » :

find . -group admin

En plus du filtrage par propriétaire et par groupe, il est également possible de filtrer par droits daccès. Une suite de trois nombres du système octal est utilisée. Les valeurs fréquemment utilisées sont « 644 », « 755 », etc. Le premier nombre définit les droits d’accès pour le propriétaire, le second pour le groupe et le troisième pour les autres utilisateurs. Chacun des trois nombres octaux est généré en ajoutant les droits individuels. Nous expliquons exactement comment cela fonctionne dans notre article sur l’attribution des droits sur un répertoire avec chmod.

Pour trouver des fichiers entièrement accessibles à nimporte quel utilisateur, on utilise l’option de recherche « -perm » suivie de la valeur « 777 » :

find . -perm 777

Pour trouver des fichiers qui ne sont entièrement accessibles quau propriétaire, on utilise l’option de recherche « -perm » suivie de la valeur « 700 »:

find . -perm 700

Il est également possible d’utiliser la commande find sous Linux pour rechercher des fichiers qui ont au moins certaines autorisations spécifiées. Pour ce faire, on met immédiatement un signe moins devant le nombre octal :

find . -perm -007

Limiter la profondeur de récursivité de la commande Linux find

Normalement, la commande Linux find parcourt tous les sous-répertoires de manière récursive. Cependant, il peut être utile de limiter la profondeur de la récursivité. Pour ce faire, on utilise les options de recherche « -maxdepth » et « -mindepth » :

Options

Significations

-maxdepth

Profondeur de récursivité maximale

-mindepth

Profondeur de récursivité minimale

Pour rechercher des fichiers d’une taille supérieure à 50 mégaoctets et n’incluant que des répertoires qui ne sont pas à plus de deux niveaux sous le répertoire actuel, on utilise la commande suivante :

find . -type f -maxdepth 2 -size +50M

Pour rechercher des fichiers d’une taille supérieure à 50 mégaoctets et n’incluant que des répertoires entre trois et cinq niveaux inférieurs au répertoire actuel, on utilise la commande suivante :

find . -type f -mindepth 3 -and -maxdepth 5 -size +50M

Rechercher et traiter des fichiers avec la commande Linux find

Jusqu’à présent, nous nous sommes limités à la recherche de fichiers sous Linux. Cependant, de nombreux cas d’utilisation nécessitent un traitement massif des fichiers trouvés. C’est le cas pour la réparation des droits d’accès sur des logiciels comme WordPress ou la suppression de fichiers après un piratage. On utilise également la commande find pour ces cas d’utilisation.

Considérons le modèle général pour exécuter une commande pour chaque fichier trouvé. On utilise l’option « -exec », suivie d’une commande Linux et de ses options. La commande entière est complétée par le texte « {} \; », qui reste toujours le même :

find <chemin> <option> -exec <commande_et_options> {} \;

Notez que la commande est exécutée sans requête. En fonction des options de recherche sélectionnées et de la commande donnée, l’exécution de la commande find avec l’option « -exec » peut endommager sérieusement le système.

Afin de limiter les risques, on peut utiliser l’option « -ok », similaire à l’option « -exec ». Elle oblige l’utilisateur à confirmer la modification de chaque fichier trouvé :

find <chemin> <option> -ok <commande_et_options> {} \;

Par précaution, nous limitons dans les exemples suivants la profondeur de récursivité à un seul sous-répertoire en utilisant « -maxdepth 1 ».

Note

Attention : soyez prudent avec les exemples suivants. Nous vous recommandons fortement de créer un dossier spécifique pour les essayer. Avant d’exécuter les exemples, accédez à ce dossier pour vous assurer de ne pas endommager le système !

Modifier le propriétaire et le groupe avec la commande Linux find

Pour définir le propriétaire et le groupe de tous les fichiers et répertoires sur la valeur « www-data », on utilise la commande find suivante avec la commande chown :

find . -maxdepth 1 -exec chown www-data:www-data {} \;

Modifier les autorisations des fichiers avec la commande Linux find

Pour rechercher des fichiers avec les droits d’accès « 777 » et les changer en « 664 », on utilise la commande find suivante avec la commande chmod :

find . -type f -maxdepth 1 -perm 777 -exec chmod 664 {} \;

Pour changer les droits de tous les répertoires en « 755 », on utilise la commande find suivante avec la commande chmod :

find . -type d -maxdepth 1 -exec chmod 755 {} \;

Utiliser la commande Linux find pour supprimer les répertoires et fichiers vides

Il est également possible d’utiliser la commande find pour supprimer les fichiers et répertoires trouvés. Par précaution, nous ne montrons cette possibilité ici que pour les fichiers et répertoires vides. De plus, au lieu du paramètre « -exec », on utilise le paramètre « -ok » pour obliger l’utilisateur à consentir explicitement à la suppression.

Pour supprimer les répertoires vides sous Linux, on utilise la commande find suivante avec la commande rmdir :

find . -type d -maxdepth 1 -empty -ok rmdir {} \;

Pour supprimer les fichiers vides sous Linux, on utilise la commande find suivante avec la commande rm :

find . -type f -maxdepth 1 -empty -ok rm {} \;