Verwendung finden mit -L

34

ich habe

link -> file

ich mache

find -L . -name 'link'

Und bekomme

./link

Warum das?

Mannentdeckung sagt:

-L: Folgen Sie symbolischen Links. Wenn find Informationen zu Dateien prüft oder druckt, werden die verwendeten Informationen aus den Eigenschaften der Datei entnommen, auf die der Link verweist, nicht aus dem Link selbst (es sei denn, es handelt sich um einen unterbrochenen symbolischen Link oder einen Fund, der die Datei nicht prüfen kann auf die der Link verweist).

Ankur Agarwal
quelle

Antworten:

12

Mit -Lprüft es die Eigenschaften der Datei - Inhalte oder Metadaten, nicht die des Links. Wenn Sie beispielsweise Folgendes verwenden -atime, wird atimedie Datei und nicht der Link überprüft :

$ find testdir/ -name link -newer testdir/ref
testdir/link
$ find -L testdir/ -name link -newer testdir/ref
$

testdir/linkwurde nach erstellt testdir/ref, aber die Datei, auf die es zeigt, war nicht.

Kevin
quelle
1
Kannst du mein Beispiel erklären? Was ich verstehe ist folgendes: In meinem Beispiel startet find seine Suche. Es stößt auf ./link, da -L es tatsächlich dereferenziert und die Eigenschaften von ./file übernimmt. Es vergleicht den Namen von ./file mit dem Muster 'link' und sollte keine O / P melden, da er nicht übereinstimmt. Was ist falsch an meiner Argumentation?
Ankur Agarwal
Aus dem von Ihnen zitierten Find Manual geht hervor, "dass die verwendeten Informationen den Eigenschaften der Datei entnommen werden sollen, auf die der Link verweist." Der Name einer Datei gehört nicht zu ihren Eigenschaften, daher wird weiterhin der Name des Links verwendet. Das ist auch viel nützlicher als der Name der realen Datei.
Kevin
"Der Name der Datei gehört nicht zu ihren Eigenschaften" Das wusste ich nicht. Gibt es noch andere Attribute von Dateien, die nicht als Eigenschaften gelten? Um ehrlich zu sein, bin ich immer noch skeptisch und würde warten, was andere zu sagen haben.
Ankur Agarwal
Wie @abc, wusste nicht, dass ein Dateiname keine Dateieigenschaft ist. Wo finde ich diese Information in irgendwelchen Dokumentationen und / oder Manpages? Weitere Informationen zu den Dateieigenschaften finden Sie unter.
Joker
34

Die allgemeine Regel lautet, dass, wenn ein Befehl Verknüpfungen bearbeitet (dh Verzeichniseinträge, die auf Inodes verweisen), der Befehl Symlinks eher als sich selbst als als das Objekt behandelt, auf das der Link verweist. Andernfalls wird der Befehl auf das ausgeführt, auf das der Symlink verweist. So cpfolgt Symlinks standardmäßig und kopiert den Inhalt der Datei durch den Link wies auf. Wenn Sie jedoch cpaufgefordert werden, Verzeichniseinträge durch Angabe von zu bearbeiten -R, werden keine Symlinks mehr verfolgt. mvFunktioniert immer mit Verzeichniseinträgen und folgt daher niemals Symlinks.

Die findnormale Aktivität des Befehls besteht darin, Verzeichniseinträge zu bearbeiten, sodass Symlinks standardmäßig nicht gefolgt werden. Das Hinzufügen von -LUrsachen findfür das Verfolgen von Symlinks für alle Eigenschaften mit Ausnahme derjenigen, die bei der Verzeichnissuche nicht ignoriert werden können, ist der Name. Einer der Zwecke von find -nameist, eine Eingabe für Befehle wie mvund bereitzustellen rm, die Verzeichniseinträge bearbeiten. Es würde unangenehme und überraschende Ergebnisse geben, wenn find -L dir -nameNamen erzeugt werden könnten, die außerhalb des Verzeichnisbaums verweisen, auf den verwurzelt ist dir.

Kyle Jones
quelle
WOW! Warum ist dieses subtile Konzept auf Manpages nicht gut dargestellt (es sei denn, ich habe es übersehen)? Das ist eine große Überraschung für mich.
Ankur Agarwal
2
@Kyle Jones There would be unpleasant and surprising results if find -L dir -name` könnte Namen erzeugen, die auf den Verzeichnisbaum außerhalb von dir verweisen find dir -name pattern. weil das Hinzufügen von -L das Zeigen auf ein
externes Verzeichnis
Wie kommt man also cp -Rdazu, Dinge unter einem Symlink zu kopieren?
Javadba