GNU/Linux >> Tutoriels Linux >  >> Linux

Un guide de la commande Linux "Rechercher"

La commande find permet aux utilisateurs de rechercher des fichiers et d'effectuer des actions sur ceux-ci. Il fait partie du package "findutils" et est fourni avec toutes les distributions. Il est très flexible, vous permettant de rechercher des fichiers et des répertoires en fonction de diverses conditions. En option, il vous permet également de prendre différents types d'actions sur les résultats.

Dans cet article, nous allons comprendre comment travailler avec la commande find. Nous illustrerons également son utilisation à travers divers exemples tout au long de cet article.

Présentation

La structure de base de la commande find est la suivante :

find [paths] [expression] [actions]

La commande find prend un certain nombre de chemins et recherche les fichiers et les répertoires dans chaque chemin « récursivement ». Ainsi, lorsque la commande find rencontre un répertoire à l'intérieur du chemin donné, elle recherche d'autres fichiers et répertoires à l'intérieur. Encore une fois, s'il y a d'autres répertoires à l'intérieur, la commande find les examinera également. Ce processus se poursuit jusqu'à ce qu'il ait recherché tous les éléments à l'intérieur du chemin que vous avez spécifié.

Par défaut, la commande find trouve tout dans un répertoire. Si vous souhaitez filtrer certains d'entre eux en fonction de certains critères, vous pouvez spécifier une expression pour le faire.

L'action par défaut consiste à imprimer tous les résultats. Cependant, vous pouvez également spécifier une action personnalisée que la commande de recherche peut effectuer sur les résultats.

Ces concepts deviendront plus clairs au fur et à mesure que nous passerons en revue divers exemples mentionnés plus loin dans cet article.

Trouver tous les fichiers et répertoires

Imaginez que vous vouliez lister tous les répertoires et fichiers pour un chemin donné. Par exemple, si vous souhaitez répertorier le contenu du /usr/share répertoire, exécutez :

find /usr/share

Cela vous donnera une liste de fichiers et de répertoires, comme indiqué dans la capture d'écran ci-dessous. Selon le contenu du répertoire, cette liste peut être très longue !

Si vous souhaitez répertorier le contenu de plusieurs répertoires, vous pouvez procéder ainsi :

find /usr/share /bin /usr/lib

Si vous voulez lister le contenu du répertoire de travail courant, utilisez un point(. ) comme chemin :

find .

Lorsqu'il n'y a pas de chemin, la commande find suppose qu'elle doit fonctionner avec le répertoire courant. Donc, vous pouvez laisser le . et utilisez simplement :

find

Rechercher des éléments par leur nom

Comme nous l'avons mentionné précédemment, vous pouvez filtrer les résultats de la commande find à l'aide d'expressions. Dans cette section, nous allons apprendre à filtrer les éléments par leur nom.



Si vous voulez trouver un fichier ou un répertoire nommé NEWS.txt à l'intérieur du /usr répertoire, utilisez le -name changer comme ceci :

find /usr -name NEWS.txt

Le -name le commutateur est sensible à la casse. Si vous ne connaissez pas la casse exacte de l'article que vous recherchez, vous pouvez utiliser le -iname commutateur qui est insensible à la casse :

find /usr -iname news.txt

Le -name et -iname les commutateurs acceptent également les « caractères génériques », qui sont des caractères spéciaux qui agissent comme des espaces réservés. Il y a deux caractères génériques — le ? caractère représente un seul caractère inconnu, et le * caractère représente n'importe quel nombre de caractères inconnus (y compris zéro).

Si vous souhaitez utiliser un caractère générique, vous devez conserver le name /iname paramètre entre guillemets simples ou doubles. Depuis le * et ? sont également des caractères spéciaux pour le shell, les mettre entre guillemets garantit que la commande fonctionne correctement.

Par exemple, si vous devez rechercher tous les fichiers et répertoires dans /usr qui ont un .txt à la fin de leur nom, vous pouvez utiliser :

find /usr -name '*.txt'

Si vous souhaitez rechercher des fichiers et des répertoires avec quatre lettres dans leur nom, exécutez :

find /usr -name '????'

Parfois, vous voudrez peut-être faire correspondre le chemin d'accès complet à un fichier/répertoire, au lieu de simplement faire correspondre le nom. Dans une telle situation, vous pouvez utiliser le -path changer. Par exemple, disons que vous voulez trouver tous les fichiers et répertoires avec un .txt à la fin de leur nom, mais uniquement s'ils se trouvent dans un répertoire nommé src . Ainsi, dans le chemin complet, il y aura un /src/ quelque part au milieu, et un .txt à la fin. Ainsi, la commande sera :

find /usr -path '*/src/*.txt'

Il y a aussi le -ipath switch, qui est la version insensible à la casse de -path .

Rechercher des fichiers ou des répertoires

Tous les exemples que nous avons vus jusqu'à présent renvoient des fichiers et des répertoires. Cependant, si vous devez rechercher uniquement des fichiers ou des répertoires, vous pouvez utiliser le -type changer. Les paramètres les plus courants de -type sont :

  • f :fichiers
  • d :répertoires
  • l  : liens symboliques

Par exemple, pour trouver tous les fichiers dans le /usr répertoire, exécutez :

find /usr -type f

Vous pouvez également combiner les différents commutateurs de la commande find. Par exemple, pour trouver tous les .txt fichiers dans le /usr répertoire, vous pouvez utiliser :

find /usr -type f -name '*.txt'

De même, pour trouver des répertoires dans /usr qui commencent par "python", utilisez :

find /usr -type d -name 'python*'

Rechercher des fichiers vides

La commande find prend en charge le -empty flag pour rechercher les fichiers et répertoires vides. Un fichier vide est un fichier qui n'a aucun contenu, alors qu'un répertoire vide est un fichier qui ne contient aucun fichier ou sous-répertoire.

Par exemple, si vous souhaitez rechercher une liste de répertoires vides dans votre répertoire personnel, vous pouvez exécuter :

find ~ -type d -empty

Annuler des correspondances

La commande find vous permet également de « nier » une correspondance. Ceci est utile lorsque nous avons un critère à exclure de notre recherche.



Par exemple, supposons que vous souhaitiez rechercher des fichiers dans le /usr répertoire qui n'a pas le .txt extension. Vous pouvez annuler le -name switch en ajoutant un point d'exclamation (! ) devant, comme indiqué :

find /usr -type f ! -name '*.txt'

Vous pouvez également inverser n'importe quel autre commutateur. Donc, si vous voulez trouver les répertoires non vides dans votre répertoire personnel, exécutez :

find /usr -type f ! -empty

Recherche basée sur la propriété

La commande find prend en charge la recherche de fichiers et de répertoires en fonction de leurs informations de propriété.

Pour trouver les fichiers ou répertoires qui appartiennent à un utilisateur particulier, vous pouvez utiliser le -user changer. Par exemple, si vous souhaitez rechercher tous les fichiers du système appartenant à l'utilisateur booleanworld , exécutez :

find / -type f -user booleanworld

Vous pouvez également utiliser l'ID d'un utilisateur dans la commande ci-dessus, au lieu du nom d'utilisateur. Vous pouvez rechercher l'ID d'un utilisateur avec la commande suivante :

id -u <username>

De même, le -group switch vous permet de rechercher des fichiers et des répertoires appartenant à un groupe particulier. Il peut également accepter un nom de groupe ou un ID de groupe. Vous pouvez afficher l'ID de groupe d'un utilisateur avec la commande suivante :

id -g <username>

Rechercher des fichiers en fonction de la date et de l'heure

Parfois, vous devrez peut-être rechercher des fichiers en fonction du moment où ils ont été consultés ou modifiés. Sur un système Linux, il existe trois types de "temps" associés à un fichier :

  • Heure de modification :La dernière fois que le contenu du fichier a été modifié.
  • Temps d'accès :La dernière fois que le fichier a été lu.
  • Modifier l'heure  :la dernière fois que le fichier (soit son contenu, soit ses métadonnées, telles que les autorisations) a été modifié.

Pour rechercher des fichiers en fonction de l'heure de modification, d'accès ou de changement, la commande de recherche a -mtime , -atime et -ctime commutateurs. Ces commutateurs vous permettent de filtrer les fichiers en fonction du nombre de jours. Ici, un « jour » fait référence à une période de 24 heures.

Comprenons comment utiliser ces drapeaux. Par exemple, si vous utilisez -mtime , puis :

  • -mtime 2  :Le fichier a été modifié il y a 2 jours (c'est-à-dire dans les dernières 48 à 72 heures).
  • -mtime -2  :Le fichier a été modifié il y a moins de 2 jours (c'est-à-dire dans les dernières 48 heures).
  • -mtime +2  :Le fichier a été modifié il y a plus de 2 jours (c'est-à-dire 3 jours ou plus, ce qui signifie 72 heures ou plus).

Donc, pour trouver des fichiers en /usr qui ont été modifiés il y a deux jours, lancez :

find /usr -type f -mtime 2

Le -atime et -ctime les commutateurs fonctionnent exactement de la même manière que -mtime .

Si vous trouvez qu'une journée est un peu trop longue, vous pouvez aussi utiliser -mmin , -amin ou -cmin pour filtrer en quelques minutes. Donc, -amin +5 signifie les fichiers qui ont été consultés il y a plus de 5 minutes, -amin -5 signifie que le fichier a été modifié il y a moins de 5 minutes, et ainsi de suite.

Vous pouvez utiliser plusieurs de ces drapeaux à la fois. Si vous voulez trouver des fichiers modifiés il y a 2 jours et consultés il y a 5 minutes, exécutez :

find /usr -type f -mtime 2 -amin 5

Vous pouvez même répéter le même drapeau ! Par exemple, vous souhaitez rechercher des fichiers modifiés il y a entre 50 et 100 jours, utilisez :

find /usr -type f -mtime +50 -mtime -100

Recherche basée sur la taille

La commande find a un -size commutateur pour permettre aux utilisateurs de rechercher des fichiers en fonction de leur taille. Étant donné que seuls les fichiers peuvent avoir une taille de fichier, lorsque vous utilisez ce commutateur, aucun répertoire ne sera répertorié.

Pour spécifier la taille du fichier, nous mettons un nombre suivi d'une lettre pour représenter l'unité. Vous pouvez utiliser les lettres suivantes :

  • c :octets
  • k :kilo-octets
  • M :mégaoctets
  • G :gigaoctets

De plus, vous pouvez utiliser un + ou - pour imposer une condition "supérieur à" ou "inférieur à".

Comprenons cela avec quelques exemples. Si vous souhaitez répertorier tous les fichiers du système d'une taille de 10 Ko, utilisez :

find / -size 10k

Pour trouver des fichiers dont la taille est supérieure à 1 Go, utilisez :

find / -size +1G

De même, pour rechercher des fichiers dont la taille est inférieure à 10 Mo, utilisez :

find / -size -10M

Recherche basée sur les autorisations

La commande find prend en charge le -perm basculer pour autoriser les recherches basées sur les autorisations. Il vous permet d'effectuer une recherche basée à la fois sur les modes numériques et symboliques. Si vous n'êtes pas familier avec les autorisations, vous pouvez trouver un aperçu ici.

Utilisation des autorisations symboliques

Commençons par un exemple simple. Supposons que vous souhaitiez rechercher tous les fichiers et répertoires dans le /usr répertoire avec les permissions de rwxr-xr-x . Pour ce faire, lancez :

find /usr -perm u=rwx,g=rx,o=rx

Les lettres u , g et o signifient respectivement "utilisateur", "groupe" et "propriétaire".

Vous pouvez également utiliser la lettre a pour vérifier les autorisations qui s'appliquent à tous les utilisateurs. Par exemple, pour trouver tous les fichiers et répertoires du système avec la permission r-xr-xr-x , exécutez :

find /usr -perm a=rx

Souvent, nous sommes intéressés à faire correspondre un sous-ensemble des autorisations. Par exemple, vous pouvez rechercher des fichiers sur le système qui peuvent être exécutés par tous les utilisateurs. Dans ce cas, nous nous soucions seulement que le bit d'exécution soit défini pour les trois classes d'autorisation. Cependant, le reste des bits peut être activé ou désactivé.

Étant donné que toutes les classes d'autorisation doivent avoir le bit d'exécution défini, nous écrivons l'autorisation sous la forme a=x . Ensuite, nous ajoutons un / devant pour indiquer que nous avons l'intention de faire correspondre un sous-ensemble d'autorisations. Ainsi, la commande est :

find / -type f -perm /a=x

Utiliser des autorisations numériques

Prenons le premier exemple de la section précédente. C'est assez simple — rwxr-xr-x est 644 en mode numérique, vous pouvez donc simplement exécuter :

find /usr -perm 644

La vérification d'un sous-ensemble d'autorisations est un peu plus complexe. Comme nous l'avons mentionné précédemment, la recherche de fichiers que tout le monde peut exécuter implique de vérifier si le bit d'exécution est défini. Nous ne nous soucions pas des autres morceaux. Pour chaque bit que nous devons vérifier, nous mettons un 1, et pour le reste nous mettons un 0. Avec ce processus, nous obtenons un nombre binaire et nous le convertissons en octal comme indiqué :

Ensuite, nous ajoutons un - devant ce nombre pour indiquer que nous avons l'intention de faire correspondre un sous-ensemble d'autorisations. Ainsi, la commande est :

find / -type f -perm -111

Recherche basée sur les indicateurs de droits d'accès

Supposons maintenant que vous souhaitiez effectuer une recherche basée sur les indicateurs de droits numériques. À cette fin, vous pouvez utiliser les modes numérique ou symbolique.

Par exemple, supposons que vous souhaitiez rechercher tous les fichiers de votre système avec le bit setuid défini. Nous pouvons étendre ce que nous avons appris sur les modes numériques à cette situation. Dans ce cas, nous ne nous soucions que de l'indicateur setuid, qui a une valeur de 4. Cependant, nous ne nous soucions d'aucun des bits d'autorisation, ce qui signifie que nous obtenons 000. Ainsi, nous pouvons rechercher ces fichiers en utilisant :

find / -type f -perm -4000

Bien sûr, vous pouvez également filtrer les bits d'autorisation. Si vous êtes intéressé par des fichiers que tous les utilisateurs peuvent exécuter et que le bit setuid est également défini, remplacez 4000 par 4111 dans la commande ci-dessus. (Nous avons déjà vu comment obtenir la valeur 111.)

De même, vous pouvez utiliser 2000 pour le bit setgid et 1000 pour le bit collant. Si vous souhaitez tester une combinaison de ces bits, additionnez les valeurs. Par exemple, pour tester les bits setuid et sticky, vous utiliserez 5000 (=4000 + 1000).

Si vous voulez faire la même chose avec les modes symboliques, vous pouvez utiliser :

find / -type f -perm /u=s

Pour le bit setgid, utilisez /g=s , et pour le sticky bit, utilisez /o=t . Pour tester une combinaison de ces bits, séparez-les par des virgules, comme /u=s,o=t .

Limiter la profondeur de parcours

Comme nous l'avons mentionné précédemment, la commande find recherche les éléments de manière récursive. Cependant, les résultats obtenus peuvent être très volumineux et vous souhaiterez peut-être définir une limite à la profondeur de recherche de la commande find. Cela peut être fait avec le -maxdepth commutateur.

Si vous exécutez la commande suivante, vous remarquerez que tous les éléments affichés n'ont pas plus de trois niveaux :

find / -maxdepth 3

Dans d'autres situations, vous souhaiterez peut-être définir une limite de profondeur minimale. La commande find prend également en charge le -mindepth commutateur à cet effet. Donc, si vous exécutez :

find / -mindepth 3

Opérations logiques dans la commande find

Dans les sections précédentes, nous avons vu les drapeaux pris en charge par la commande find. Nous avons également vu comment nous pouvons combiner différents drapeaux et les nier. Dans certaines situations, nous avons besoin de constructions plus puissantes.

La commande find prend en charge les conditions "et" et "ou" avec le -a et -o commutateurs. Il prend également en charge le regroupement de parties d'une expression avec des parenthèses () . Cependant, comme les parenthèses sont également des caractères spéciaux pour le shell, vous devez les mettre entre guillemets simples ou doubles. De plus, lorsque vous spécifiez plusieurs drapeaux l'un après l'autre, la commande de recherche suppose automatiquement un "et".

Considérons un exemple que nous avons vu auparavant - trouver des répertoires à l'intérieur de /usr qui commencent par "python". Là, nous avons utilisé la commande :

find /usr -type d -name 'python*'

Vous pouvez également écrire le "et" explicitement comme suit :

find /usr -type d -a -name 'python*'

Maintenant, considérons un exemple différent. Supposons que vous souhaitiez rechercher des fichiers/répertoires sur le système qui ont été modifiés au cours des 5 dernières minutes ou avant 50 jours. Pour cette commande, nous utiliserons l'opérateur "ou" comme ceci :

find / -mmin -5 -o -mtime +50

Supposons ensuite que nous imposions une restriction supplémentaire au problème ci-dessus - vous souhaitez rechercher uniquement des fichiers. Dans un premier temps, nous conserverons les conditions de filtrage des fichiers modifiés dans un groupe. Ensuite, nous allons « et » avec la condition de trouver des fichiers. Ainsi, la commande finale est :

find / '(' -mmin -5 -o -mtime +50 ')' -a -type f

Depuis le -a est implicite, vous pouvez également l'omettre de la commande ci-dessus.

Prendre des mesures

Jusqu'à présent, toutes les commandes de recherche impriment les résultats sur le terminal. Habituellement, nous souhaitons effectuer certaines actions avec ces résultats, telles que copier ou supprimer ces éléments. Heureusement, la commande find prend également en charge les "actions" sur ces résultats.

L'action par défaut consiste à imprimer tous les résultats; vous pouvez le vérifier en ajoutant le -print commutateur à la fin de toute commande de recherche. Il existe également de nombreuses autres actions. Nous examinerons ci-dessous quelques-unes des plus utiles.

Suppression de fichiers

Pour supprimer des fichiers ou des répertoires, utilisez le -delete action. Cela fonctionne avec les fichiers et les répertoires. Par exemple, si vous souhaitez supprimer tous les répertoires vides du répertoire personnel, exécutez :

find ~ -type d -empty -delete

Exécuter des commandes

La commande find prend également en charge l'exécution d'une commande personnalisée avec le -exec commutateur.

Supposons que vous souhaitiez sauvegarder tous vos fichiers audio MP3 de votre répertoire personnel sur votre disque dur externe. Supposons que le disque dur externe est disponible au /media/MyDrive . Pour copier un seul fichier, vous utiliseriez :

cp <path to file> /media/MyDrive

Pour copier tous les fichiers, vous pouvez utiliser la commande suivante.

find ~ -type f -name '*.mp3' -exec cp {} ';'

Ici, la paire d'accolades ({} ) agissent comme espace réservé pour le chemin d'accès au fichier. Afin de dire à la commande de fichier où la commande se termine, nous utilisons un point-virgule (; ). Cependant, comme il s'agit également d'un caractère spécial pour le shell, nous l'entourons de guillemets simples.

Chaque fois que la commande find trouve un fichier correspondant à la condition, elle remplace les accolades par le chemin réel et exécute la commande. Donc, le cp La commande est exécutée pour chaque fichier MP3.

Examinons une autre utilisation importante - trouver une chaîne dans de nombreux fichiers. Pour trouver la chaîne "hello" dans un fichier, nous utilisons grep comme ceci :

grep hello <file name>

Si vous connaissez grep , vous pourriez être tenté d'écrire une commande comme celle-ci :

find ~ -type f -exec grep hello {} ';'

Cependant, si vous utilisez cette commande, vous comprendrez immédiatement le problème. Nous voulons une liste de fichiers avec la chaîne "bonjour" ; cependant, nous obtenons une liste de lignes correspondantes. Heureusement, grep a un -l switch, qui lui fait imprimer le chemin du fichier s'il y a une correspondance. Ainsi, la commande sera :

find ~ -type f -exec grep -l hello {} ';'

Exécuter des commandes :une variante différente

Supposons que vous souhaitiez créer un fichier compressé. Pour créer un fichier compressé Gzip avec le nom music.tar.gz , vous exécuteriez :

tar -czf music.tar.gz <list of files>

Maintenant, supposons que vous souhaitiez compresser tous les fichiers MP3 de votre répertoire personnel en un seul fichier compressé. Peut-être trouveriez-vous ce qui suit :

find ~ -type f -name '*.mp3' -exec tar -czf music.tar.gz {} ';'

Cependant, si vous ouvrez le music.tar.gz fichier, vous remarquerez qu'il n'y a qu'un seul fichier MP3. N'oubliez pas que find exécute la commande chaque fois qu'il trouve un nouveau fichier. Ainsi, le fichier précédent a été écrasé à chaque fois par une nouvelle archive; et nous ne voulons pas que cela se produise.

Tous nos problèmes pourraient être résolus s'il y avait un moyen de dire find pour passer une liste de fichiers à tar , après avoir trouvé tous les fichiers. C'est là que la deuxième variante du -exec switch entre. Au lieu de terminer la commande par un ; , nous utilisons un + comme ça :

find ~ -type f -name '*.mp3' -exec tar -czf music.tar.gz {} +

Exécuter des commandes sur des répertoires

Parfois, il est utile d'exécuter une commande sur le répertoire dans lequel se trouve un fichier/répertoire. La commande find a un -execdir commutateur qui fait cela. Il est similaire à -exec de toutes les autres manières, et a même le + et ; variantes.

Affichage des informations sur les fichiers

Si vous souhaitez afficher des informations sur les fichiers/répertoires (telles que les autorisations et la taille), vous pouvez utiliser le -ls changer. Par exemple, si vous souhaitez afficher les détails des fichiers du système qui sont supérieurs à 1 Go, exécutez :

find / -type f -size +1G -ls

Suppression des messages d'erreur

En essayant certaines des commandes de recherche, vous pouvez avoir des erreurs telles que "Autorisation refusée". Vous pouvez masquer ces messages d'erreur en les redirigeant vers /dev/null , comme indiqué :

find [paths] [expression] [actions] 2>/dev/null

Conclusion

Dans cet article, nous avons vu comment utiliser la commande find, ainsi que des exemples qui couvrent la plupart des cas d'utilisation. Si vous voulez en savoir plus, vous pouvez lire la page de manuel en tapant man find dans votre terminal.


Linux
  1. Rechercher des fichiers et des répertoires sous Linux avec la commande find

  2. Trouver le temps d'exécution d'une commande ou d'un processus sous Linux

  3. Comment utiliser la commande Linux find pour rechercher des fichiers

  4. La commande locate sous Linux

  5. Un guide de la commande Linux "Top"

Un guide du débutant pour naviguer dans le système de fichiers Linux

Comment rechercher des fichiers avec la commande fd sous Linux

La commande timer sous Linux

15 exemples super utiles de la commande Find sous Linux

Un guide pratique pour la commande chroot sous Linux

La commande Linux find Directory :Explication