Angenommen, ich richte einen symbolischen Link ein:
ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt
Gibt es eine Möglichkeit zu sehen, was das Ziel der myothertextfile.txt
Verwendung der Befehlszeile ist?
Angenommen, ich richte einen symbolischen Link ein:
ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt
Gibt es eine Möglichkeit zu sehen, was das Ziel der myothertextfile.txt
Verwendung der Befehlszeile ist?
Verwenden Sie die -f
Flagge, um die kanonisierte Version auszudrucken. Zum Beispiel:
readlink -f /root/Public/myothertextfile.txt
Von man readlink
:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
readlink -f
.brew install coreutils
. Dies installiert grundlegende Gnu-Versionen von Befehlen, denen der Buchstabe vorangestellt istg
, dhgreadlink -f somefile
Ubuntu 18.04.1 LTS (Bionic Beaver)
den Hilfeseiten von readlink finden Sie eine Notiz mit der Aufschrift "Note realpath (1) ist der bevorzugte Befehl für die Kanonisierungsfunktion."readlink ist der gewünschte Befehl. Sie sollten sich die Manpage für den Befehl ansehen. Denn wenn Sie einer Kette symbolischer Verknüpfungen zur eigentlichen Datei folgen möchten, benötigen Sie den Schalter -e oder -f:
quelle
Dies wird auch funktionieren:
aber
readlink
würde für die Verwendung in einem Skript bevorzugt werden , anstatt das Parsenls
.quelle
Wenn Sie die Quelle und das Ziel des Links anzeigen möchten, versuchen Sie es
stat -c%N files*
. Z.BEs ist nicht gut zum Parsen (dafür verwenden
readlink
), aber es zeigt den Linknamen und das Ziel an, ohne die Unordnung vonls -l
-c
kann geschrieben werden--format
und%N
bedeutet "Dateiname in Anführungszeichen mit Dereferenzierung, wenn symbolischer Link".quelle
Das
readlink
ist eine gute Sache, aber GNU-spezifisch und plattformunabhängig. Früher habe ich plattformübergreifende Skripte für geschrieben/bin/sh
, daher würde ich Folgendes verwenden:oder:
Diese müssen jedoch auf verschiedenen Plattformen getestet werden. Ich denke, sie werden funktionieren, aber nicht 100% sicher für das
ls
Ausgabeformat.Das Ergebnis von
ls
kann auch innerhalb analysiert werden,bash
ohne von einem externen Befehl wieawk
,sed
oder abhängig zu seinperl
.Diese
bash_realpath
Funktion löst das endgültige Ziel eines Links auf (Link → Link → Link → Final):quelle
Wenn Sie nicht verwenden können
readlink
, können Sie das Ergebnis vonls -l
folgendermaßen analysieren .Das normale Ergebnis wäre:
Also wollen wir alles ersetzen, bevor "->" und der Pfeil enthalten sind. Wir könnten dafür verwenden
sed
:quelle
Die Frage ist nicht genau genug, um eine einfache Antwort wie die von brian-brazil zu geben:
wird in der Tat jeden Symlink dereferenzieren, der in das Pfadkonstrukt zum endgültigen Ziel dahinter involviert ist
some_path
.Eine Ebene von kaskadierenden Symlinks ist jedoch nur ein besonderer Fall unter anderen in einem System, wobei der allgemeine Fall N Ebenen von kaskadierenden Symlinks ist. Schau dir folgendes auf meinem System an:
rwhich
Ist meine eigene rekursive Implementierungwhich
, die alle zwischengeschalteten kaskadierenden Symlinks (zu stderr) bis zum endgültigen Ziel (zu stdout) ausgibt.Wenn ich dann wissen will, was ist:
Das Ziel von symlink / usr / bin / emacs ** ist die offensichtliche Antwort für mich
/etc/alternatives/emacs
:Als endgültiges Ziel für die Kaskadierung von symlinks / usr / bin / emacs muss die Antwort lauten
/usr/bin/emacs24-x
:quelle
ll
oderls -l
sollte die Verzeichniselemente einschließlich Ihres symbolischen Links und seines Ziels auflistencd -P /root/Public/myothertextfile.txt
(In Ihrem Fall) sollte auf den ursprünglichen Pfad verweisenquelle
Wenn Sie das Ziel aller Links innerhalb eines Ordners und seines Unterordners finden, verwenden Sie den
find . -type l -ls
Befehl mit dem Linktyp wie folgt:Wenn du das Ziel einer Single haben willst, dann
ls -l
sollte das funktionieren:quelle