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.
- Assurez-vous d'être dans le bon répertoire de départ. Tout le travail de cet atelier sera effectué dans
~/project.
cd ~/project
- Créez un nouveau répertoire nommé
find_labet placez-vous à l'intérieur.
mkdir find_lab
cd find_lab
- Maintenant, créons un ensemble de fichiers et un sous-répertoire pour nos recherches. Nous utiliserons la commande
touchpour créer des fichiers vides etmkdirpour 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.findremplace{}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.
- La commande
locateest fournie par le paquetmlocate, 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 utiliserezsudocar 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.
- Maintenant, naviguons dans notre répertoire de test des étapes précédentes.
cd ~/project/find_lab
- Essayez de trouver le fichier
report.txten utilisantlocate.
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.
- Si vous n'avez vu aucune sortie à l'étape 3, la base de données doit être mise à jour manuellement. Utilisez la commande
updatedbpour 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.
- Après avoir exécuté
updatedb(si nécessaire), essayez à nouveau la commandelocate:
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.
- Tout d'abord, créons un nouveau fichier dans notre répertoire
find_lab.
touch special_report.pdf
- 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éé.
- Vous pouvez forcer une mise à jour de la base de données système :
sudo updatedb
- 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
locateautomatiquement (souvent quotidiennement via des tâches cron). - Vous pouvez la mettre à jour manuellement avec
sudo updatedblorsque vous avez besoin de résultats immédiats. locateest 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,
findpeut ê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
- 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 commandepasswdinteragit.whereisinclut souvent des fichiers de configuration importants dans ses résultats./usr/share/man/...: Ce sont les pages de manuel compressées pour la commande.
- 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
- 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
- Il est important de comprendre les limites de
whereis. Il ne cherche que dans les répertoires système standards. Essayons de trouver le fichierreport.txtque nous avons créé dans notre répertoirefind_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.
- 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 commandedateà la place.
alias pwd='date'
- 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.
- La commande
whichlocalise 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
- La commande
typeest 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
- Pour voir toutes les commandes possibles correspondant à un nom, vous pouvez utiliser le drapeau
-a(all). C'est particulièrement puissant avectype.
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.
- La commande
unaliassupprime une définition d'alias de la session shell actuelle.
unalias pwd
- Maintenant, lancez à nouveau
pwdettype pwdpour 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.



