„Finden“ funktioniert nicht auf dem symbolisch verknüpften Pfad?

„Finden“ funktioniert nicht auf dem symbolisch verknüpften Pfad?

Wenn ich diesen Befehl ausführe find $HOME/MySymlinkedPath -name "run*.sh", passiert nichts und es tritt kein Fehler auf („MySymlinkedPath“ ist ein symbolischer Link zu einer anderen Festplatte als meiner $HOME-Festplatte).

Auch das hier schlägt fehl:

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

Und nur um sicherzugehen: Dieser nicht vorhandene Pfad schlägt (natürlich) fehl, find $HOME/MySymlinkedPathDUMMYTEST -name "run*.sh"also wird der Pfad gefunden (weil dieser Fehler nicht auftritt), aber finddie Suche wird nicht danach ausgeführt, und ich bin jetzt völlig ratlos.

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

Eine zusätzliche Information:
dieser Befehl funktioniert wie üblich ls $HOME/MySymlinkedPath/run*.sh, und wenn ich dorthin gehe cd $HOME/MySymlinkedPathund ihn ausführe, ls ..ist das Ergebnis nicht das erwartete – die Liste der Pfade, in denen sich der symbolische Link befindet – es gibt die Liste der tatsächlichen Pfade auf dem anderen Medium/der anderen Festplatte zurück!!!

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

Umdenken:
Ist das ein Problem mit findund lsoder mit meinem System? Oder ist es zu erwarten und überhaupt kein Problem?? Ich verwende Ubuntu 12.10. Es schlägt auf allen Terminals fehl, die ich getestet habe, also scheint es kein „Problem“ mit dem Terminal zu sein.

Antwort1

Hierist die Antwort. Aber diese Frage weist 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 endet der rekursive Abstieg hier. Wenn der Ausdruck übereinstimmt "$HOME/MySymlinkedPath"(z. B. in find "$HOME/MySymlinkedPath" -name 'My*'), findwürde dann dies als Übereinstimmung ausgeben.

Wie dort erwähnt, habe ich festgestellt, dass der einfachste/sauberste Weg, damit umzugehen und alle Skripte zu reparieren, stattdessen Folgendes ist:

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

fügen Sie einfach einen Schrägstrich hinzu, sodass findnicht mit dem symbolischen Link, sondern mit dem Ziel des symbolischen Links begonnen wird:

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

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

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

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

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

verwandte Informationen