Pourquoi find
ne retourne-t-il pas les résultats attendus ? Voici comment le corriger
Si vous avez déjà exécuté la commande find
dans votre système basé sur Unix, vous avez peut-être rencontré une situation frustrante où la commande ne parvient pas à localiser des fichiers que vous savez présents. Par exemple, vous pouvez vouloir rechercher des fichiers de script shell, et malgré votre certitude qu’ils existent, la sortie est vide. Ce problème courant provient souvent de malentendus sur la façon dont la commande find
interprète les caractères génériques. Explorons le problème et découvrons les solutions pour remettre votre recherche sur les rails.
Le problème : find
ne fonctionne pas comme prévu
Considérons cette commande que vous avez peut-être essayée:
$ find /usr -name *.sh
Cette commande est censée rechercher tous les fichiers avec l’extension .sh
dans le répertoire /usr
. Cependant, si vous constatez qu’aucun résultat n’apparaît, vous pourriez vous demander, Pourquoi find
ne fonctionne-t-il pas ?
Vous savez que les scripts sont là ; par exemple, lorsque vous exécutez:
$ ls /usr/local/lib/*.sh
Vous pouvez voir des fichiers comme tclConfig.sh
et tkConfig.sh
. Alors, qu’est-ce qui ne va pas avec votre commande find
?
Comprendre le problème
Le principal problème est de savoir comment le shell de commande interprète le caractère générique *.sh
. Plus précisément, s’il existe des fichiers dans votre répertoire actuel qui correspondent à *.sh
, le shell étend ce caractère générique avant même que find
ait la chance d’agir. Cela peut conduire à un comportement inattendu:
-
Expansion de caractères génériques
- Si des fichiers
.sh
existent dans votre répertoire actuel, par exemple,tkConfig.sh
, taperfind /usr -name *.sh
l’étendra àfind /usr -name tkConfig.sh
, limitant effectivement votre recherche à ce seul fichier.
- Si des fichiers
-
Erreurs de syntaxe
- Si plusieurs fichiers correspondent,
find
peut générer une erreur de syntaxe en raison d’arguments ambigus :find: option incorrecte tkConfig.sh
- Si plusieurs fichiers correspondent,
Solution 1 : Citer le caractère générique
Pour empêcher le shell d’étendre le caractère générique avant de le transmettre à find
, vous pouvez citer le caractère générique:
- Utilisez soit des guillemets doubles :
$ find /usr -name "*.sh"
- Ou utilisez des guillemets simples :
$ find /usr -name '*.sh'
En citant *.sh
, vous indiquez au shell de le transmettre tel quel à find
, permettant ainsi à celui-ci de rechercher tous les fichiers .sh
dans le répertoire spécifié.
Solution 2 : Suivre les liens symboliques
Une autre raison potentielle pour laquelle find
pourrait ne pas fonctionner comme prévu est la présence de liens symboliques dans le répertoire /usr
ou ses sous-répertoires. Par défaut, find
ne suit pas les liens symboliques. Si vous suspectez que cela soit le cas, vous pouvez utiliser l’option -follow
:
$ find /usr -follow -name '*.sh'
Cette commande permet à find
de traverser les liens symboliques et de rechercher les fichiers désirés.
Conclusion
En résumé, si vous trouvez que la commande find
ne produit pas les résultats attendus lors de la recherche de scripts shell, il s’agit probablement d’une expansion de caractères génériques ou de la présence de liens symboliques. N’oubliez jamais de citer vos caractères génériques pour éviter une expansion prématurée et, si nécessaire, utilisez l’option -follow
. En employant ces stratégies, vous pourrez localiser vos scripts shell avec succès et améliorer votre maîtrise de la ligne de commande !
Bonne recherche !
Vous êtes maintenant prêt à aborder la commande find
avec confiance ! Si vous avez des questions ou des problèmes supplémentaires, n’hésitez pas à les laisser dans les commentaires ci-dessous.