Rechercher des fichiers et des répertoires sous Linux avec la commande find | Opensource.com
Quelle que soit mon organisation, il semble qu’il y ait toujours des moments où je ne parviens tout simplement pas à localiser un fichier. Parfois, c’est parce que je ne me souviens pas du nom du fichier en premier lieu. D’autres fois, je connais le nom, mais je ne me souviens pas où j’ai décidé de le sauver. Il y a même des moments où j’ai besoin d’un fichier que je n’ai pas créé en premier lieu. Peu importe le dilemme, cependant, je sais que sur un système POSIX, j’ai toujours la commande find
.
Installation de find
La commande find
est définie par la spécification POSIX, qui crée le standard ouvert par lequel les systèmes POSIX (y compris Linux, BSD et macOS) sont mesurés. En termes simples, vous avez déjà find
installé tant que vous utilisez Linux, BSD ou macOS.
Cependant, toutes les commandes find
ne se ressemblent pas exactement. La commande GNU find
, par exemple, a des fonctionnalités que la commande BSD ou Busybox ou Solaris find
n’a peut-être pas ou n’a pas, mais implémente différemment. Cet article utilise GNU find
du paquet findutils car il est facilement disponible et très populaire. La plupart des commandes présentées dans cet article fonctionnent avec d’autres implémentations de find
, mais si vous essayez une commande sur une plate-forme autre que Linux et obtenez des résultats inattendus, essayez de télécharger et d’installer la version GNU.
Trouver un fichier par son nom
Vous pouvez localiser un fichier par son nom de fichier en fournissant le nom de fichier complet ou des parties du nom de fichier à l’aide d’expressions régulières. La commande find
nécessite le chemin d’accès au répertoire dans lequel vous souhaitez rechercher, des options pour spécifier l’attribut que vous recherchez (par exemple, –name
pour un nom de fichier sensible à la casse), puis la chaîne de recherche. Par défaut, votre chaîne de recherche est traitée littéralement : La commande find
recherche un nom de fichier qui correspond exactement à la chaîne que vous entrez entre guillemets, sauf si vous utilisez une syntaxe d’expression régulière.
Supposons que votre répertoire de documents contient quatre fichiers: Foo
, foo
, foobar.txt
, et foo.xml
. Voici une recherche littérale pour un fichier avec le nom “foo”:
$ find ~ -name "foo"
/home/tux/Documents/examples/foo
Vous pouvez élargir votre recherche en la rendant insensible à la casse avec l’option -iname
:
$ find ~ -iname "foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
Caractères génériques
Vous pouvez utiliser des caractères génériques de shell de base pour élargir votre recherche. Par exemple, l’astérisque (*
) représente un nombre quelconque de caractères:
$ find ~ -iname "foo*"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt
Un point d’interrogation (?
) représente un seul caractère:
$ find ~ -iname "foo*.???"
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt
Ce n’est pas une syntaxe d’expression régulière, donc le point (.
) représente un point littéral dans cet exemple.
Expressions régulières
Vous pouvez également utiliser des expressions régulières. Comme avec -iname
et -name
, il existe à la fois une option sensible à la casse et une option insensible à la casse. Contrairement aux options -name
et -iname
, cependant, une recherche -regex
et -iregex
est appliquée à l’ensemble du chemin, pas seulement au nom du fichier. Cela signifie que si vous recherchez foo
, vous n’obtenez aucun résultat car foo
ne correspond pas à /home/tux/Documents/foo
. Au lieu de cela, vous devez soit rechercher le chemin entier, soit utiliser une séquence générique au début de votre chaîne:
$ find ~ -iregex ".*foo"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
Trouver un fichier modifié au cours de la dernière semaine
Pour trouver un fichier que vous avez modifié pour la dernière fois la semaine dernière, utilisez l’option -mtime
avec un nombre (négatif) de jours dans le passé:
$ find ~ -mtime -7
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt
Trouver un fichier modifié dans une plage de jours
Vous pouvez combiner les options -mtime
pour localiser un fichier dans une plage de jours. Pour le premier argument -mtime
, indiquez le nombre de jours le plus récent que vous auriez pu modifier le fichier, et pour le second, indiquez le plus grand nombre de jours. Par exemple, cette recherche recherche des fichiers avec des temps de modification supérieurs à un jour dans le passé, mais pas plus de sept:
$ find ~ -mtime +1 -mtime -7
Limiter une recherche par type de fichier
Il est courant d’optimiser les résultats de find
en spécifiant le type de fichier que vous recherchez. Vous ne devez pas utiliser cette option si vous n’êtes pas sûr de ce que vous recherchez, mais si vous savez que vous recherchez un fichier et non un répertoire, ou un répertoire mais pas un fichier, cela peut être un excellent filtre à utiliser. L’option est -type
, et ses arguments sont un code lettre représentant quelques types de données différents. Les plus courants sont:
-
d
– annuaire -
f
– fichier -
l
– lien symbolique -
s
– prise -
p
– tuyau nommé (utilisé pour FIFO) -
b
– bloc spécial (généralement une désignation de disque dur)
Voici quelques exemples:
$ find ~ -type d -name "Doc*"
/home/tux/Documents
$ find ~ -type f -name "Doc*"
/home/tux/Downloads/10th-Doctor.gif
$ find /dev -type b -name "sda*"
/dev/sda
/dev/sda1
Adjust scope
La commande find
est récursive par défaut, ce qui signifie qu’elle recherche les résultats dans les répertoires des répertoires contenus dans les répertoires (et ainsi de suite). Cela peut devenir écrasant dans un grand système de fichiers, mais vous pouvez utiliser l’option -maxdepth
pour contrôler la profondeur de votre structure de dossiers que vous souhaitez que find
descende:
$ find /usr -iname "*xml" | wc -l
15588
$ find /usr -maxdepth 2 -iname "*xml" | wc -l
15
Vous pouvez alternativement définir la profondeur minimale de récursivité avec -mindepth
:
$ find /usr -mindepth 8 -iname "*xml" | wc -l
9255
Télécharger la feuille de triche
Cet article ne couvre que les fonctions de base de find
. C’est un excellent outil pour rechercher dans votre système, mais c’est aussi un frontal très utile pour la puissante commande parallèle. Il y a de nombreuses raisons d’apprendre find
, alors téléchargez notre feuille de triche find
gratuite pour vous aider à en savoir plus sur la commande.
Leave a Reply