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:

  1. Expansion de caractères génériques

    • Si des fichiers .sh existent dans votre répertoire actuel, par exemple, tkConfig.sh, taper find /usr -name *.sh l’étendra à find /usr -name tkConfig.sh, limitant effectivement votre recherche à ce seul fichier.
  2. 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
      

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.