Trouver des fichiers et des commandes sous Linux

CompTIABeginner
Pratiquer maintenant

Introduction

Dans cet atelier, vous allez acquérir une maîtrise des techniques fondamentales pour localiser des fichiers et des commandes dans l'environnement de ligne de commande Linux. Vous commencerez par utiliser la puissante commande find, en apprenant à effectuer des recherches basiques par nom et à exploiter les caractères génériques pour une correspondance de motifs plus flexible. Cette approche pratique vous guidera à travers la création d'une structure de répertoires d'exemple pour exercer vos compétences de recherche en toute sécurité.

Sur la base de ces acquis, vous explorerez comment exécuter des commandes sur vos résultats de recherche à l'aide de -exec et xargs. L'atelier couvre également des outils de recherche alternatifs et spécialisés, notamment la commande locate (rapide et basée sur une base de données), whereis pour trouver les binaires et les manuels des commandes, ainsi que des utilitaires comme alias, which et type pour analyser le chemin d'exécution des commandes. À la fin de ce module, vous serez capable de choisir l'outil approprié pour n'importe quelle tâche de recherche de fichier ou de commande sous Linux.

Effectuer des recherches de fichiers de base avec find et les caractères génériques

Dans cette étape, vous apprendrez à utiliser la commande find, l'un des outils les plus puissants de la ligne de commande Linux pour rechercher des fichiers et des répertoires. Nous commencerons par des recherches basées sur le nom et introduirons des caractères génériques pour trouver des modèles de fichiers.

Tout d'abord, créons un répertoire dédié et quelques fichiers d'exemple pour notre pratique. Cela nous assure de disposer d'un environnement contrôlé pour observer le fonctionnement de find sans affecter d'autres parties du système de fichiers.

  1. Assurez-vous d'être dans le bon répertoire de départ. Tout le travail de cet atelier sera effectué dans ~/project.
cd ~/project
  1. Créez un nouveau répertoire nommé find_lab et placez-vous à l'intérieur.
mkdir find_lab
cd find_lab
  1. Maintenant, créons un ensemble de fichiers et un sous-répertoire pour nos recherches. Nous utiliserons la commande touch pour créer des fichiers vides et mkdir pour le répertoire.
touch file1.txt file2.log report.txt File1.TXT
mkdir subdir
touch subdir/file3.txt subdir/another.log

Vous pouvez vérifier la structure avec la commande ls -R, qui liste les fichiers du répertoire courant et de ses sous-répertoires de manière récursive.

ls -R

Vous devriez voir une sortie similaire à celle-ci :

.:
File1.TXT  file1.txt  file2.log  report.txt  subdir

./subdir:
another.log  file3.txt

Maintenant que notre environnement de test est prêt, commençons les recherches.

La syntaxe de base de la commande find est find [path] [expression]. Le [path] indique à find où commencer la recherche, et l' [expression] définit ce qu'il faut chercher.

Recherche par nom de fichier exact

Pour trouver un fichier par son nom exact, utilisez l'expression -name. Cherchons le fichier report.txt. Nous utiliserons . comme chemin, ce qui indique à find de commencer la recherche à partir du répertoire courant.

find . -name "report.txt"

La sortie affichera le chemin vers le fichier trouvé :

./report.txt

Recherche avec des caractères génériques

Les caractères génériques vous permettent de rechercher des fichiers basés sur des motifs. Le caractère générique le plus courant est l'astérisque (*), qui correspond à n'importe quelle séquence de caractères.

Il est recommandé d'entourer le motif de guillemets doubles (") pour empêcher le shell d'interpréter le caractère générique avant que la commande find ne puisse l'utiliser.

Cherchons tous les fichiers qui se terminent par l'extension .txt.

find . -name "*.txt"

find cherchera récursivement dans le répertoire courant (.) et tous ses sous-répertoires :

./file1.txt
./report.txt
./subdir/file3.txt

Remarquez que File1.TXT n'a pas été trouvé car -name effectue une recherche sensible à la casse. Pour effectuer une recherche insensible à la casse, utilisez l'expression -iname (insensitive name).

find . -iname "*.txt"

Désormais, la sortie inclut tous les fichiers se terminant par .txt, quelle que soit la casse :

./file1.txt
./report.txt
./File1.TXT
./subdir/file3.txt

Recherche par type de fichier

Vous pouvez également demander à find de ne chercher que des types spécifiques d'objets du système de fichiers, comme des fichiers ou des répertoires, en utilisant l'expression -type. Utilisez -type f pour les fichiers réguliers et -type d pour les répertoires.

Cherchons uniquement les répertoires dans notre emplacement actuel.

find . -type d

La sortie liste le répertoire courant (.) et le sous-répertoire subdir que nous avons créé :

.
./subdir

Vous pouvez combiner des expressions pour créer des recherches plus spécifiques. Par exemple, pour trouver tous les fichiers (et non les répertoires) qui se terminent par .log :

find . -type f -name "*.log"

Cette commande trouvera tous les éléments qui sont des fichiers ET dont le nom se termine par .log.

./file2.log
./subdir/another.log

Vous avez maintenant appris les bases de l'utilisation de find avec des motifs de noms et des filtres de type. Dans les étapes suivantes, nous explorerons des capacités plus avancées de cette commande.

Exécuter des actions sur les résultats de recherche avec find -exec et xargs

Dans cette étape, vous irez au-delà du simple listage de fichiers. Vous apprendrez à exécuter des commandes directement sur les fichiers trouvés par la commande find. C'est une technique puissante pour effectuer des opérations en masse, telles que la modification des permissions, la suppression de fichiers ou l'exécution de scripts personnalisés. Nous aborderons deux méthodes principales : l'option -exec de find et la commande xargs.

Nous continuerons à travailler dans le répertoire ~/project/find_lab de l'étape précédente. Tout d'abord, assurez-vous d'être dans le bon répertoire.

cd ~/project/find_lab

Utilisation de find -exec

L'option -exec vous permet de lancer une commande arbitraire pour chaque fichier localisé par find. La syntaxe peut sembler un peu inhabituelle au début :

find [path] [expression] -exec [command] {} \;

  • [command] : La commande que vous souhaitez exécuter (ex: ls -l, rm, chmod).
  • {} : C'est un espace réservé spécial. find remplace {} par le chemin complet du fichier actuel qu'il a trouvé.
  • \; : C'est un terminateur obligatoire pour la commande -exec. L'antislash (\) est nécessaire pour empêcher le shell d'interpréter le point-virgule comme un caractère spécial.

Essayons. Nous allons trouver tous les fichiers avec l'extension .txt et exécuter ls -l sur chacun d'eux pour voir leurs informations détaillées.

find . -name "*.txt" -exec ls -l {} \;

La sortie montre le résultat de ls -l exécuté trois fois, une fois pour chaque fichier .txt trouvé :

-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./file1.txt
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./report.txt
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./subdir/file3.txt

Par mesure de sécurité, find propose une option -ok, qui fonctionne exactement comme -exec mais vous demande une confirmation avant d'exécuter la commande sur chaque fichier. Ceci est fortement recommandé lors de l'exécution d'opérations destructrices comme la suppression de fichiers (rm).

Essayons de supprimer les fichiers .log que nous avons créés précédemment, mais cette fois en utilisant -ok par sécurité.

find . -name "*.log" -ok rm {} \;

Pour chaque fichier trouvé, find vous demandera votre confirmation. Tapez y et appuyez sur Entrée pour approuver la suppression.

< rm ... ./file2.log > ? y
< rm ... ./subdir/another.log > ? y

Après confirmation, vous pouvez vérifier que les fichiers ont disparu en listant le contenu du répertoire.

ls -R
.:
File1.TXT  file1.txt  report.txt  subdir

./subdir:
file3.txt

Utilisation de xargs

Une alternative à -exec consiste à rediriger la sortie de find vers la commande xargs. xargs lit les éléments de l'entrée standard (les chemins de fichiers fournis par find) et exécute une commande spécifiée avec ces éléments comme arguments.

Le principal avantage de xargs est l'efficacité. Alors que -exec ... \; lance la commande une fois pour chaque fichier, xargs regroupe les chemins de fichiers et lance la commande moins souvent avec de nombreux arguments à la fois.

Tout d'abord, recréons les fichiers journaux que nous venons de supprimer pour avoir de la matière à traiter.

touch file2.log subdir/another.log

Maintenant, utilisons find et xargs pour lister les détails de nos fichiers .log.

find . -name "*.log" | xargs ls -l

La sortie est similaire à l'exemple -exec, mais la structure de la commande est différente :

-rw-r--r-- 1 labex labex 0 <date> <time> ./file2.log
-rw-r--r-- 1 labex labex 0 <date> <time> ./subdir/another.log

Tout comme find -ok, xargs possède également un mode "confirmation" via l'option -p. Il affichera la commande qu'il s'apprête à exécuter et demandera votre accord.

Utilisons cela pour supprimer à nouveau les fichiers .log.

find . -name "*.log" | xargs -p rm

xargs regroupera les fichiers dans une seule commande rm et demandera votre confirmation. Tapez y et appuyez sur Entrée.

rm ./file2.log ./subdir/another.log ?...y

Vous avez maintenant utilisé avec succès -exec et xargs pour agir sur les résultats de recherche, une compétence fondamentale pour automatiser les tâches sous Linux.

Utiliser locate et updatedb pour des recherches rapides basées sur une base de données

Dans cette étape, vous découvrirez une alternative à find appelée locate. Alors que find parcourt le système de fichiers en temps réel, locate effectue ses recherches dans une base de données de chemins de fichiers pré-construite. Cela rend locate nettement plus rapide, mais avec un compromis crucial : il ne peut trouver que les fichiers qui existaient lors de la dernière mise à jour de la base de données.

Nous poursuivrons notre travail dans le répertoire ~/project. Tout d'abord, assurons-nous que les outils nécessaires sont installés.

  1. La commande locate est fournie par le paquet mlocate, qui n'est pas forcément installé par défaut. Exécutez la commande suivante pour mettre à jour votre liste de paquets et l'installer. Vous utiliserez sudo car il s'agit d'une installation au niveau du système.
sudo apt-get update && sudo apt-get install -y mlocate

Vous verrez la progression de l'installation du paquet, ce qui est normal.

  1. Maintenant, naviguons dans notre répertoire de test des étapes précédentes.
cd ~/project/find_lab
  1. Essayez de trouver le fichier report.txt en utilisant locate.
locate report.txt

Sur de nombreux systèmes, la base de données locate est mise à jour automatiquement, vous pourriez donc voir le fichier immédiatement :

/home/labex/project/find_lab/report.txt

Si vous voyez le chemin du fichier, cela signifie que la base de données contient déjà des informations sur vos fichiers récemment créés. Cela peut arriver lorsque le système exécute automatiquement des mises à jour de base de données en arrière-plan.

  1. Si vous n'avez vu aucune sortie à l'étape 3, la base de données doit être mise à jour manuellement. Utilisez la commande updatedb pour reconstruire la base de données :
sudo updatedb

Cette commande ne produit aucune sortie, mais elle travaille en arrière-plan. Cela peut prendre quelques instants pour se terminer.

  1. Après avoir exécuté updatedb (si nécessaire), essayez à nouveau la commande locate :
locate report.txt

Elle devrait maintenant trouver et afficher le chemin vers le fichier :

/home/labex/project/find_lab/report.txt

Comprendre les limitations de la base de données locale

Explorons ce qui se passe lorsque vous créez de nouveaux fichiers après la dernière mise à jour de la base de données.

  1. Tout d'abord, créons un nouveau fichier dans notre répertoire find_lab.
touch special_report.pdf
  1. Essayez de localiser ce nouveau fichier :
locate special_report.pdf

Si la base de données du système a été mise à jour très récemment, vous pourriez voir le fichier. Sinon, il n'y aura aucune sortie car la base de données ne connaît pas encore ce fichier nouvellement créé.

  1. Vous pouvez forcer une mise à jour de la base de données système :
sudo updatedb
  1. Essayez maintenant de localiser le fichier à nouveau :
locate special_report.pdf

Vous devriez maintenant voir :

/home/labex/project/find_lab/special_report.pdf

Comprendre la fréquence de mise à jour de la base de données

Le point essentiel à retenir est que locate dépend de la fraîcheur de sa base de données. Dans les systèmes de production :

  • Le système met généralement à jour la base de données locate automatiquement (souvent quotidiennement via des tâches cron).
  • Vous pouvez la mettre à jour manuellement avec sudo updatedb lorsque vous avez besoin de résultats immédiats.
  • locate est extrêmement rapide car il interroge un index pré-construit plutôt que de scanner le système de fichiers.
  • Pour trouver des fichiers créés très récemment, find peut être plus fiable puisqu'il cherche en temps réel.

Vous avez maintenant appris comment locate permet des recherches ultra-rapides en utilisant une base de données pré-construite, et compris l'importance de maintenir cette base à jour avec updatedb.

Localiser les binaires et les manuels des commandes avec whereis

Dans cette étape, vous apprendrez à utiliser whereis, une commande spécialisée pour localiser le binaire, la source et les fichiers de page de manuel d'une commande. Contrairement à find ou locate, qui sont destinés à la recherche de fichiers d'ordre général, whereis est optimisé pour trouver rapidement les fichiers essentiels associés à une commande système. Il fonctionne en cherchant dans une liste prédéfinie de répertoires Linux standards, ce qui le rend extrêmement rapide.

Commençons par explorer la commande whereis. Vous pouvez être dans n'importe quel répertoire pour cela, car whereis ne cherche pas par rapport à votre emplacement actuel. Nous resterons dans le répertoire ~/project par souci de cohérence.

cd ~/project
  1. Trouvons les emplacements de la commande passwd, qui est utilisée pour changer les mots de passe des utilisateurs.
whereis passwd

La sortie affiche le nom de la commande, suivi des chemins vers son exécutable binaire et ses pages de manuel associées.

passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
  • /usr/bin/passwd : C'est le programme exécutable.
  • /etc/passwd : C'est le fichier de base de données des utilisateurs du système, avec lequel la commande passwd interagit. whereis inclut souvent des fichiers de configuration importants dans ses résultats.
  • /usr/share/man/... : Ce sont les pages de manuel compressées pour la commande.
  1. Vous pouvez filtrer les résultats pour n'afficher que certains types de fichiers. Pour voir uniquement les fichiers binaires associés à passwd, utilisez le drapeau -b (binary).
whereis -b passwd

Cela restreint la sortie à l'exécutable et aux fichiers liés, en excluant les pages de manuel.

passwd: /usr/bin/passwd /etc/passwd
  1. De même, pour trouver uniquement les pages de manuel, utilisez le drapeau -m (manual). C'est utile lorsque vous voulez savoir quelle documentation est disponible pour une commande.
whereis -m passwd

La sortie ne liste plus que les emplacements des pages de manuel.

passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
  1. Il est important de comprendre les limites de whereis. Il ne cherche que dans les répertoires système standards. Essayons de trouver le fichier report.txt que nous avons créé dans notre répertoire find_lab.
whereis report.txt

La commande ne renvoie que le nom du fichier, mais aucun chemin :

report.txt:

Cela se produit parce que report.txt se trouve dans votre répertoire personnel (~/project/find_lab), qui n'est pas un emplacement standard pour les binaires système ou les pages de manuel. Cela démontre la différence clé : utilisez find ou locate pour vos fichiers personnels ou de projet, et utilisez whereis pour enquêter sur les commandes système.

Vous avez maintenant appris à utiliser whereis pour localiser rapidement les fichiers qui composent une commande Linux, une compétence utile pour l'administration système et le dépannage.

Analyser les chemins de commande avec alias, which et type

Dans cette dernière étape, nous explorerons comment le shell détermine quelle commande exécuter lorsque vous tapez son nom. Ce n'est pas toujours aussi simple que de trouver un fichier sur le disque. Le shell a un ordre de priorité spécifique : il vérifie d'abord les alias, puis les commandes intégrées au shell (built-ins), et enfin il cherche dans les répertoires listés dans la variable système $PATH pour trouver un fichier exécutable. Vous apprendrez à utiliser alias pour créer des raccourcis de commande, ainsi que which et type pour diagnostiquer vers quoi pointe réellement un nom de commande.

Commençons par créer un alias temporaire pour voir comment il affecte l'exécution des commandes. Nous resterons dans le répertoire ~/project.

  1. Un alias est un raccourci défini par l'utilisateur pour une autre commande. Créons un alias qui fait en sorte que la commande pwd (print working directory) exécute la commande date à la place.
alias pwd='date'
  1. Maintenant, exécutez la commande pwd.
pwd

Au lieu d'afficher votre répertoire actuel, elle affiche la date et l'heure actuelles, car l'alias est prioritaire.

<date et heure actuelles>

Investigation avec which et type

Maintenant, imaginez que vous ne soyez pas au courant de l'existence de cet alias. Comment pourriez-vous diagnostiquer pourquoi pwd se comporte mal ? C'est là que which et type sont utiles.

  1. La commande which localise un fichier exécutable dans les répertoires listés dans la variable d'environnement $PATH.
which pwd

La sortie affichera :

pwd: aliased to date
  1. La commande type est plus complète. C'est une commande intégrée au shell qui décrit comment le shell interprétera un nom de commande, incluant les alias et les fonctions intégrées.
type pwd

Cette commande identifie correctement la situation :

pwd is an alias for date
  1. Pour voir toutes les commandes possibles correspondant à un nom, vous pouvez utiliser le drapeau -a (all). C'est particulièrement puissant avec type.
type -a pwd

Cela révèle toute la hiérarchie pour le nom de commande pwd :

pwd is an alias for date
pwd is a shell builtin
pwd is /usr/bin/pwd
pwd is /bin/pwd

Cette sortie vous indique l'ordre de préférence du shell : il utilisera l'alias en premier. Si l'alias n'existait pas, il utiliserait la commande pwd intégrée au shell. Si aucune de ces deux options n'existait, il exécuterait le programme situé à /usr/bin/pwd.

Supprimer un alias

Enfin, nettoyons notre expérience en supprimant l'alias.

  1. La commande unalias supprime une définition d'alias de la session shell actuelle.
unalias pwd
  1. Maintenant, lancez à nouveau pwd et type pwd pour confirmer que tout est revenu à la normale.
pwd

Sortie :

/home/labex/project
type pwd

Sortie :

pwd is a shell builtin

Vous avez maintenant appris à créer et supprimer des alias et, plus important encore, à utiliser which et type pour comprendre exactement quelle commande le shell va exécuter.

Résumé

Dans cet atelier, vous avez appris à rechercher des fichiers et des répertoires à travers le système de fichiers Linux. Vous avez commencé par la puissante commande find, en utilisant des critères basés sur le nom et des caractères génériques pour les recherches de base, puis vous avez progressé vers l'exécution de commandes sur les résultats de recherche avec -exec et xargs. Vous avez également exploré la commande locate comme une alternative plus rapide basée sur une base de données, en apprenant à maintenir cette base avec updatedb.

De plus, l'atelier a couvert des techniques pour localiser et analyser les commandes. Vous avez utilisé whereis pour trouver l'emplacement des binaires de commande et de leurs pages de manuel. Pour comprendre le chemin d'exécution des commandes, vous avez appris à utiliser which pour identifier l'exécutable spécifique appelé et type pour déterminer si une commande est un alias, une commande intégrée ou un fichier, tout en analysant comment les alias influencent le comportement des commandes.