find funktioniert nicht auf symlinked path?


13

Wenn ich diesen Befehl ausführe find $HOME/MySymlinkedPath -name "run*.sh", passiert nichts und gibt keinen Fehler aus ('MySymlinkedPath' ist ein verknüpfter Pfad zu einer anderen Festplatte als meiner $ HOME-Festplatte).

Dies schlägt auch fehl:

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

Und nur um sicherzugehen, dass dieser nicht vorhandene Pfad (natürlich) fehlschlägt, find $HOME/MySymlinkedPathDUMMYTEST -name "run*.sh"sodass der Pfad gefunden wird (weil dieser Fehler nicht auftritt), aber findkeine Suche darauf durchführt, und ich bin jetzt sehr ahnungslos.

Es funktioniert nur, wenn ich cd $HOME/MySymlinkedPathzuerst die Pfadreferenz wie folgt entferne, find -name "run*.sh"aber das ist nicht gut für meine Skripte.

Eine zusätzliche Information :
Dieser Befehl funktioniert wie gewohnt ls $HOME/MySymlinkedPath/run*.sh, und wenn ich dorthin gehe cd $HOME/MySymlinkedPathund dies ausführe, entspricht ls ..das Ergebnis nicht meinen Erwartungen - die Liste des Pfads, in dem sich der verknüpfte Pfad befindet - und gibt die Liste des tatsächlichen Pfads zurück das andere Medium / Festplatte !!!

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

Überdenken :
Ist das ein Problem mit findund lsoder mit meinem System? oder wird es erwartet und überhaupt kein problem ?? Ich bin auf Ubuntu 12.10. Es schlägt auf allen von mir getesteten Terminals fehl und scheint daher kein "Problem" des Terminals zu sein.


1
Ich fand eine bessere Antwort "find -follow". stackoverflow.com/questions/105212/…
Jarod

@ Jarod Manpage sagt -follow ist veraltet und wir sollten -L (das ist auch --follow) wie bei meiner Antwort unten verwenden:>
Aquarius Power

Antworten:


19

Hier ist die Antwort. Diese Frage deutet jedoch darauf hin, dass Bash das Ziel des Problems ist.

Die Erklärung ist, dass findfindet "$HOME/MySymlinkedPath". Es ist ein symbolischer Link, kein Verzeichnis, daher stoppt der rekursive Abstieg dort. Wenn der Ausdruck übereinstimmt "$HOME/MySymlinkedPath"(z. B. in find "$HOME/MySymlinkedPath" -name 'My*'), wird er findals Übereinstimmung gedruckt.

Wie dort erwähnt, stellte ich fest, dass der einfachste / sauberste Weg, damit umzugehen und alle Skripte zu reparieren, statt:

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

Fügen Sie einfach einen Schrägstrich hinzu, damit dieser findnicht vom symbolischen Link, sondern vom Ziel des symbolischen Links ausgeht:

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

Alternativ können Sie die -HOption an find(beachten Sie, dass sie vor den Pfaden stehen muss) übergeben, um sie anzuweisen, symbolische Links zu durchlaufen, die über die Befehlszeile übergeben wurden. (Dies unterscheidet sich von -Lder Anweisung find, symbolische Verknüpfungen zu durchlaufen, die auch während des rekursiven Abstiegs auftreten.)

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

Und schließlich hat es hier am besten funktioniert -L(aufgrund der verschiedenen Dateisysteme, die ich über Ordner verknüpft habe). Aber es erzeugt eine Menge unproblematischer Fehlermeldungen, also habe ich hinzugefügt 2>/dev/null; und beschlossen auch, diesen Alias ​​zu erstellen alias find='find -L':

find -L "$HOME/MySymlinkedPath" -name "run*.sh" 2>/dev/null

2
IMHO ist es im Allgemeinen eine gute Praxis, einen abschließenden Schrägstrich nach Verzeichnissen zu verwenden, um anzuzeigen, dass es sich tatsächlich um Verzeichnisse handelt. :) Macht die Dinge lesbarer usw.
dannysauer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.