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 find
die Suche wird nicht danach ausgeführt, und ich bin jetzt völlig ratlos.
Es funktioniert nur, wenn ich cd $HOME/MySymlinkedPath
zuerst 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/MySymlinkedPath
und 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 find
und ls
oder 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 find
findet "$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*'
), find
wü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 find
nicht mit dem symbolischen Link, sondern mit dem Ziel des symbolischen Links begonnen wird:
find "$HOME/MySymlinkedPath/" -name "run*.sh"
Alternativ können Sie die -H
Option 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 -L
der Anweisung, find
symbolische 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