find ne fonctionne pas sur le chemin du lien symbolique?

14

Si find $HOME/MySymlinkedPath -name "run*.sh"j'exécute cette commande, rien ne se passe et ne donne aucune erreur ('MySymlinkedPath' est un chemin lié à un autre disque dur autre que mon $ HOME).

Celles-ci échouent également:

find ~/MySymlinkedPath -name "run*.sh"
find /home/MyUserName/MySymlinkedPath -name "run*.sh"

Et juste pour être sûr, ce chemin inexistant échoue (bien sûr) find $HOME/MySymlinkedPathDUMMYTEST -name "run*.sh"donc le chemin est trouvé (parce que cette erreur ne se produit pas) mais findn'effectue pas la recherche dessus, et je suis beaucoup ignorant maintenant.

Cela ne fonctionne que si je cd $HOME/MySymlinkedPathcommence par supprimer la référence de chemin comme celle-ci, find -name "run*.sh"mais ce n'est pas bon pour mes scripts.

Une information supplémentaire :
cette commande fonctionne comme d'habitude ls $HOME/MySymlinkedPath/run*.sh, et si j'y vais cd $HOME/MySymlinkedPathet l'exécute, ls ..le résultat n'est pas ce que j'attendais - la liste du chemin où se trouve le chemin du lien symbolique - il renvoie la liste du vrai chemin sur l'autre média / disque dur !!!

pwd -P
/media/MediaIdentifier/RealPath
pwd
/home/MyUser/MySymlinkedPath

Repenser :
est-ce un problème avec findet ls, ou avec mon système? ou c'est prévu et pas un problème du tout ?? Je suis sur Ubuntu 12.10. Il échoue sur tous les terminaux que j'ai testés et ne semble donc pas être un "problème" de terminal.

Puissance du Verseau
la source
1
J'ai trouvé une meilleure réponse "find -follow". stackoverflow.com/questions/105212/…
Jarod
La page de manuel @Jarod indique que -follow est déconseillé et nous devrions utiliser -L (qui est également --follow) comme dans ma réponse ci-dessous:>
Aquarius Power

Réponses:

20

Voici la réponse. Mais cette question indique que bash est la cible du problème.

L'explication est que findtrouve "$HOME/MySymlinkedPath". C'est un lien symbolique, pas un répertoire, donc la descente récursive s'arrête là. Si l'expression correspondait "$HOME/MySymlinkedPath"(par exemple, dans find "$HOME/MySymlinkedPath" -name 'My*'), alors findl'imprimerait comme une correspondance.

Comme indiqué ici, j'ai trouvé que le moyen le plus simple / le plus propre de le gérer et de corriger tous les scripts est, au lieu de:

find "$HOME/MySymlinkedPath" -name "run*.sh"

il suffit d'ajouter une barre oblique, de sorte que cela findcommence non pas par le lien symbolique mais par la cible du lien symbolique:

find "$HOME/MySymlinkedPath/" -name "run*.sh"

Alternativement, passez l' -Hoption à find(notez qu'elle doit venir en premier, avant les chemins) pour lui dire de traverser les liens symboliques passés sur sa ligne de commande. (Ceci est différent de celui -Lqui indique findde traverser également les liens symboliques rencontrés lors de la descente récursive.)

find -H "$HOME/MySymlinkedPath" -name "run*.sh"

Et finalement, cela a mieux fonctionné ici -L(en raison des nombreux systèmes de fichiers avec lesquels j'ai créé des liens symboliques via des dossiers). Mais il génère des charges de messages d'erreur non problématiques, j'ai donc ajouté 2>/dev/null; et a également décidé de créer cet alias alias find='find -L':

find -L "$HOME/MySymlinkedPath" -name "run*.sh" 2>/dev/null
Puissance du Verseau
la source
2
À mon humble avis, il est généralement recommandé d'utiliser une barre oblique de fin après les répertoires pour indiquer qu'il s'agit en fait de répertoires. :) Rend les choses plus lisibles, etc.
dannysauer