Commande find de Linux : comment trouver des fichiers et des répertoires

La commande find dans Linux parcourt le répertoire spécifié et ses sous-éléments pour trouver des fichiers ou des répertoires correspondant à des conditions telles que le nom, le type ou la taille. Spécifiez l'emplacement de recherche et les conditions ensemble, et mettez les modèles de nom de fichier entre guillemets afin que le shell ne les développe pas à l'avance.

Format de base et portée de la recherche

Dans le format suivant, le chemin de départ est l'endroit où la recherche commence, et les conditions limitent ce qu'il faut trouver. Le chemin lui-même est également inclus dans la cible de recherche. Les exemples ci-dessous sont basés sur GNU findutils find et Bash.

find PATH EXPRESSION

find . explore le répertoire courant et ses sous-répertoires, et find /etc commence à partir de /etc. Si aucune condition n'est spécifiée, il imprime les chemins et explore également les fichiers et répertoires cachés. Les répertoires sans permissions peuvent afficher des erreurs d'accès, et leur contenu ne sera pas recherché.

L'exercice suivant crée des fichiers dans un nouveau répertoire temporaire. Vous devez continuer dans le même terminal pour conserver la variable workdir. Après avoir imprimé le chemin pour vérifier l'emplacement, exécutez l'exemple.

workdir=$(mktemp -d)
mkdir -p "$workdir/docs" "$workdir/empty-dir"
touch "$workdir/docs/app.conf" "$workdir/docs/EXTRA.CONF" "$workdir/docs/notes.txt" "$workdir/.hidden.conf" "$workdir/empty.txt"
printf '%s\n' "$workdir"

Rechercher par nom et type de fichier

-name correspond avec une sensibilité à la casse pour le composant final du chemin, et non pour le chemin complet. -iname ne distingue pas la casse. Les guillemets simples empêchent le shell de développer * avant de transmettre le motif à find.

find "$workdir" -name '*.conf'
find "$workdir" -iname '*.conf'

La première commande recherche app.conf et .hidden.conf, et la deuxième commande trouve également EXTRA.CONF. L'ordre de sortie peut varier selon l'environnement. Taper find /etc *.conf n'impose aucune condition de nom et peut agir de manière inattendue selon l'expansion du shell, donc évitez-le. Utilisez plutôt find /etc -name '*.conf'.

-type f recherche des fichiers ordinaires, -type d recherche des répertoires. Si les conditions sont combinées, toutes doivent être satisfaites.

find "$workdir" -type f -name '*.conf'
find "$workdir" -type d -name 'docs'

La première commande affiche uniquement les fichiers réguliers avec des extensions correspondantes, la seconde affiche uniquement les répertoires nommés docs. Par défaut, GNU find ne suit pas les liens symboliques dans les sous-répertoires. Pour rechercher les liens eux-mêmes, utilisez -type l.

Restreindre la plage par profondeur et éléments vides

-maxdepth 1 recherche uniquement jusqu'au chemin de départ et les éléments directement en dessous. Pour exclure le chemin de départ des résultats, spécifiez également -mindepth 1. Il est recommandé de placer les deux options avant les conditions dans GNU find.

find "$workdir" -mindepth 1 -maxdepth 1 -type d

En pratique, docs et empty-dir situés immédiatement en dessous seront affichés. -empty trouve les fichiers réguliers vides et les répertoires vides, vous pouvez donc distinguer en spécifiant le type que vous souhaitez.

find "$workdir" -type f -empty
find "$workdir" -type d -empty

Les fichiers créés avec touch dans la pratique sont tous vides. Dans la deuxième commande, empty-dir apparaît. Ne considérez pas directement les résultats de la recherche comme des cibles à supprimer ; vérifiez d'abord le chemin et les conditions.

Exécution de commandes sur les fichiers trouvés

-exec exécute des commandes sur les éléments correspondants. L'exemple suivant affiche le nombre d'octets des fichiers ordinaires sans les supprimer. {} est remplacé par le chemin trouvé, et + regroupe autant que possible plusieurs chemins pour les passer à la commande.

find "$workdir" -type f -name '*.conf' -exec wc -c -- {} +

Comme les fichiers de pratique sont vides, le nombre d'octets pour chaque fichier est affiché comme 0. wc peut également afficher le total si plusieurs fichiers sont reçus. Même s'il y a des espaces dans les noms de fichiers, chaque chemin est passé comme un argument séparé. Pour exécuter la commande pour chaque élément séparément, vous pouvez utiliser \; au lieu de +.

Avant de combiner des commandes de suppression ou de modification, affichez d'abord uniquement les chemins dans les mêmes conditions et vérifiez les cibles et les sauvegardes. Dans les répertoires où d'autres utilisateurs peuvent modifier des fichiers pendant la recherche, les cibles peuvent changer même après vérification, donc une prudence supplémentaire est nécessaire. Pour plus de détails, référez-vous à GNU find considérations de sécurité.

Lorsque les résultats sont différents de ceux attendus

S'il n'y a pas de résultats, vérifiez le chemin de départ, la casse des lettres dans le nom, l'extension et le type de fichier dans cet ordre. Vérifiez également si le motif a été placé entre guillemets, et si le chemin complet est nécessaire au lieu de -name. Lors d'une recherche basée sur le chemin complet, vous pouvez utiliser -path.

S'il y a une erreur d'autorisation, cela signifie qu'il y a des zones qui n'ont pas pu être recherchées. Vérifiez les autorisations d'accès nécessaires et, lors de l'utilisation des privilèges administrateur, limitez soigneusement la plage de recherche et les actions à exécuter. Les significations détaillées des motifs de nom et des options peuvent être trouvées dans explication des motifs de nom de GNU find.