Introduction
Un des problèmes rencontrés par les utilisateurs lorsqu’ils traitent pour la première fois avec une machine Linux est de trouver les fichiers qu’ils recherchent.
Ce guide couvrira comment utiliser la bien nommée commande find
. Cela vous aidera à rechercher des fichiers sur votre VPS en utilisant une variété de filtres et de paramètres. Nous couvrirons également brièvement la commande locate
, qui peut être utilisée pour rechercher des fichiers d’une manière différente.
Recherche par nom
La manière la plus évidente de rechercher des fichiers est par nom.
Pour trouver un fichier par nom, tapez :
- find -name "query"
Ceci sera sensible à la casse, ce qui signifie qu’une recherche pour file
est différente d’une recherche pour File
.
Pour trouver un fichier par son nom, mais ignorer la casse de la requête, tapez :
- find -iname "query"
Si vous voulez trouver tous les fichiers qui n’adhèrent pas à un modèle spécifique, vous pouvez inverser la recherche avec -not
ou !
. Si vous utilisez !
, vous devez échapper le caractère pour que bash n’essaie pas de l’interpréter avant que find puisse agir:
- find -not -name "query_to_avoid"
Or
- find \! -name "query_to_avoid"
Recherche par type
Vous pouvez spécifier le type de fichiers que vous voulez trouver avec le paramètre -type
. Il fonctionne comme suit :
- find -type type_descriptor query
Voici quelques-uns des descripteurs les plus courants que vous pouvez utiliser pour spécifier le type de fichier :
-
f : fichier ordinaire
-
d : répertoire
-
l : lien symbolique
-
c : périphériques à caractères
-
b : périphériques de blocs
Par exemple, si nous voulions trouver tous les périphériques de caractères sur notre système, nous pourrions émettre cette commande :
- find / -type c
Output/dev/parport0/dev/snd/seq/dev/snd/timer/dev/autofs/dev/cpu/microcode/dev/vcsa7/dev/vcs7/dev/vcsa6/dev/vcs6/dev/vcsa5/dev/vcs5/dev/vcsa4. . .
Nous pouvons rechercher tous les fichiers qui se terminent par .conf
comme ceci :
- find / -type f -name "*.conf"
Output/var/lib/ucf/cache/:etc:rsyslog.d:50-default.conf/usr/share/base-files/nsswitch.conf/usr/share/initramfs-tools/event-driven/upstart-jobs/mountall.conf/usr/share/rsyslog/50-default.conf/usr/share/adduser/adduser.conf/usr/share/davfs2/davfs2.conf/usr/share/debconf/debconf.conf/usr/share/doc/apt-utils/examples/apt-ftparchive.conf. . .
Filtrage par temps et par taille
Find vous offre une variété de façons de filtrer les résultats par taille et par temps.
Taille
Vous pouvez filtrer par taille avec l’utilisation du paramètre -size
.
Nous ajoutons un suffixe à la fin de notre valeur qui spécifie comment nous comptons. Voici quelques options populaires:
-
c : octets
-
k : Kilooctets
-
M : Mégaoctets
-
G : Gigaoctets
-
b : blocs de 512 octets
Pour trouver tous les fichiers qui font exactement 50 octets, tapez:
- find / -size 50c
Pour trouver tous les fichiers de moins de 50 octets, on peut plutôt utiliser cette forme :
- find / -size -50c
Pour trouver tous les fichiers de plus de 700 mégaoctets, nous pouvons utiliser cette commande :
- find / -size +700M
Time
Linux stocke des données temporelles sur les temps d’accès, les temps de modification et les temps de changement.
-
Temps d’accès : Dernière fois qu’un fichier a été lu ou écrit.
-
Temps de modification : Dernière fois que le contenu du fichier a été modifié.
-
Heure de changement : Dernière fois que les métadonnées inodes du fichier ont été modifiées.
On peut les utiliser avec les paramètres -atime
, -mtime
, et -ctime
. Ceux-ci peuvent utiliser les symboles plus et moins pour spécifier plus grand que ou moins que, comme nous l’avons fait avec la taille.
La valeur de ce paramètre spécifie combien de jours auparavant vous souhaitez rechercher.
Pour trouver des fichiers qui ont un temps de modification d’il y a un jour, tapez :
- find / -mtime 1
Si nous voulons des fichiers qui ont été accédés dans moins d’un jour, nous pouvons taper :
- find / -atime -1
Pour obtenir des fichiers dont la dernière modification des informations méta remonte à plus de 3 jours, tapez :
- find / -ctime +3
Il existe également des paramètres compagnons que nous pouvons utiliser pour spécifier les minutes au lieu des jours:
- find / -mmin -1
Cela donnera les fichiers qui ont été modifiés tapez le système dans la dernière minute.
La recherche peut également faire des comparaisons par rapport à un fichier de référence et retourner ceux qui sont plus récents:
- find / -newer myfile
Recherche par le propriétaire et les permissions
Vous pouvez également rechercher des fichiers par le propriétaire du fichier ou le propriétaire du groupe.
Vous faites cela en utilisant les paramètres -user
et -group
respectivement. Trouvez un fichier qui appartient à l’utilisateur « syslog » en entrant:
- find / -user syslog
De même, nous pouvons spécifier les fichiers appartenant au groupe « shadow » en tapant:
- find / -group shadow
Nous pouvons également rechercher des fichiers avec des permissions spécifiques.
Si nous voulons correspondre à un ensemble exact de permissions, nous utilisons cette forme:
- find / -perm 644
Cela correspondra aux fichiers avec exactement les permissions spécifiées.
Si nous voulons spécifier quelque chose avec au moins ces permissions, vous pouvez utiliser cette forme:
- find / -perm -644
Cela correspondra à tous les fichiers qui ont des permissions supplémentaires. Un fichier avec des permissions de « 744 » serait mis en correspondance dans ce cas.
Filtrage par profondeur
Pour cette section, nous allons créer une structure de répertoire dans un répertoire temporaire. Elle contiendra trois niveaux de répertoires, avec dix répertoires au premier niveau. Chaque répertoire (y compris le répertoire temporaire) contiendra dix fichiers et dix sous-répertoires.
Faites cette structure en émettant les commandes suivantes :
- cd
- mkdir -p ~/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}
- touch ~/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}
- cd ~/test
N’hésitez pas à vérifier les structures de répertoire avec ls
et cd
pour avoir une idée de la façon dont les choses sont organisées. Lorsque vous avez terminé, retournez au répertoire de test :
- cd ~/test
Nous allons travailler sur la façon de retourner des fichiers spécifiques à partir de cette structure. Essayons d’abord un exemple avec juste une recherche par nom ordinaire, pour comparaison:
- find -name file1
Output./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1./level1dir7/level2dir8/level3dir6/file1./level1dir7/level2dir8/level3dir5/file1./level1dir7/level2dir8/file1. . .
Il y a beaucoup de résultats. Si nous introduisons la sortie dans un compteur, nous pouvons voir qu’il y a 1111 résultats au total:
- find -name file1 | wc -l
Output1111
C’est probablement trop de résultats pour être utile dans la plupart des circonstances. Essayons de le réduire.
Vous pouvez spécifier la profondeur maximale de la recherche sous le répertoire de recherche de premier niveau:
- find -maxdepth num -name query
Pour trouver « fichier1 » uniquement dans les répertoires de « niveau1 » et au-dessus, vous pouvez spécifier une profondeur maximale de 2 (1 pour le répertoire de premier niveau, et 1 pour les répertoires de niveau1):
- find -maxdepth 2 -name file1
Output./level1dir7/file1./level1dir1/file1./level1dir3/file1./level1dir8/file1./level1dir6/file1./file1./level1dir2/file1./level1dir9/file1./level1dir4/file1./level1dir5/file1./level1dir10/file1
C’est une liste beaucoup plus gérable.
Vous pouvez également spécifier un répertoire minimum si vous savez que tous les fichiers existent au-delà d’un certain point sous le répertoire actuel:
- find -mindepth num -name query
Nous pouvons utiliser ceci pour trouver seulement les fichiers à la fin des branches du répertoire:
- find -mindepth 4 -name file
Output./level1dir7/level2dir8/level3dir9/file1./level1dir7/level2dir8/level3dir3/file1./level1dir7/level2dir8/level3dir4/file1./level1dir7/level2dir8/level3dir1/file1./level1dir7/level2dir8/level3dir8/file1./level1dir7/level2dir8/level3dir7/file1./level1dir7/level2dir8/level3dir2/file1. . .
Encore, à cause de notre structure de répertoire ramifiée, ceci retournera un grand nombre de résultats (1000).
Vous pouvez combiner les paramètres de profondeur min et max pour vous concentrer sur une plage étroite:
- find -mindepth 2 -maxdepth 3 -name file
Output./level1dir7/level2dir8/file1./level1dir7/level2dir5/file1./level1dir7/level2dir7/file1./level1dir7/level2dir2/file1./level1dir7/level2dir10/file1./level1dir7/level2dir6/file1./level1dir7/level2dir3/file1./level1dir7/level2dir4/file1./level1dir7/file1. . .
Exécution et combinaison de commandes Find
Vous pouvez exécuter une commande auxiliaire arbitraire sur tout ce que find correspond en utilisant le paramètre -exec
. Cela s’appelle comme ceci:
- find find_parameters -exec command_and_params {} \;
La {}
est utilisée comme placeholder pour les fichiers qui trouvent des correspondances. Le \;
est utilisé pour que find sache où se termine la commande.
Par exemple, nous pourrions trouver les fichiers de la section précédente qui avaient des autorisations 644
et les modifier pour qu’ils aient des autorisations 664
:
- cd ~/test
- find . -type f -perm 644 -exec chmod 664 {} \;
Nous pourrions ensuite modifier les autorisations du répertoire comme ceci:
- find . -type d -perm 755 -exec chmod 700 {} \;
Si vous voulez enchaîner différents résultats, vous pouvez utiliser les commandes -and
ou -or
. La commande -and
est supposée si elle est omise.
- find . -name file1 -or -name file9
Trouver des fichiers en utilisant Locate
Une alternative à l’utilisation de find
est la commande locate
. Cette commande est souvent plus rapide et peut rechercher tout le système de fichiers avec facilité.
Vous pouvez installer la commande sur Debian ou Ubuntu avec apt
:
- sudo apt install mlocate
Sur CentOS, utilisez plutôt dnf
:
- sudo dnf install mlocate
La raison pour laquelle locate
est plus rapide que find
est qu’elle s’appuie sur une base de données des fichiers du système de fichiers.
La base de données est généralement mise à jour une fois par jour avec un script cron, mais vous pouvez la mettre à jour manuellement en tapant :
- sudo updatedb
Exécutez cette commande maintenant. Rappelez-vous que la base de données doit toujours être à jour si vous voulez trouver des fichiers récemment acquis ou créés.
Pour trouver des fichiers avec locate, utilisez simplement cette syntaxe:
- locate query
Vous pouvez filtrer la sortie de certaines façons.
Par exemple, pour ne retourner que les fichiers contenant la requête elle-même, au lieu de retourner tous les fichiers qui ont la requête dans les répertoires qui y mènent, vous pouvez utiliser le -b
pour ne rechercher que le « nom de base »:
- locate -b query
Pour que locate ne retourne que les résultats qui existent encore dans le système de fichiers (qui n’ont pas été supprimés entre le dernier appel updatedb
et l’appel locate
actuel), utilisez le drapeau -e
:
- locate -e query
Pour voir des statistiques sur les informations que locate a cataloguées, utilisez l’option -S
:
- locate -S
OutputDatabase /var/lib/mlocate/mlocate.db:3,315 directories37,228 files1,504,439 bytes in file names594,851 bytes used to store database
Conclusion
Les deux méthodes find et locate sont de bons moyens de trouver des fichiers sur votre système. C’est à vous de décider lequel de ces outils est approprié dans chaque situation.
Trouver et localiser sont des commandes puissantes qui peuvent être renforcées en les combinant avec d’autres utilitaires à travers des pipelines. Expérimentez le filtrage en utilisant des commandes comme wc
, sort
et grep
.