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.
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>
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>
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 d’effectuer d’abord 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 l’asté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 n’inclure que les fichiers dans les résultats de la recherche, on utilise l’option « -type » suivie de la valeur « f »:
find . -type f
Pour n’inclure 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 d’un 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
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 d’un fichier sont affichées avec un nombre suivi d’une 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 à l’utilisateur 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 d’accè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 à n’importe 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 qu’au 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 ».
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 {} \;