Comment utiliser Find et Locate pour rechercher des fichiers sur Linux

author
9 minutes, 42 seconds Read

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
Output
1111

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 -bpour 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
Output
Database /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.

Similar Posts

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.