Stellen Sie eine symbolische Verknüpfung zu einem relativen Pfadnamen her

64

Ich kann dies tun:

$ pwd
/home/beau
$ ln -s /home/beau/foo/bar.txt /home/beau/bar.txt
$ readlink -f bar.txt
/home/beau/foo/bar.txt

Aber ich würde das gerne können:

$ pwd
/home/beau
$ cd foo
$ ln -s bar.txt /home/beau/bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

Ist das möglich? Kann ich den relativen Pfadnamen irgendwie auflösen und an übergeben ln?

Humphrey Bogart
quelle
Aber was ist das Problem, dass es mit dem beschriebenen Verhalten gelöst werden würde?
Forcefsck
Angenommen, Sie bieten einen komprimierten Ordner zum Herunterladen an und möchten kopierfähige Anweisungen zum Verknüpfen einiger Ordnerdateien geben.
Humphrey Bogart
2
ln -s $(pwd)/bar.txt ~/oder fügen Sie ein Installationsskript hinzu.
Forcefsck
2
Der Link speichert tatsächlich den Namen, den Sie in der Befehlszeile verwenden. Die Auflösung dieses Namens in eine Datei erfolgt relativ zum Verknüpfungsort. Sie müssen verwendenln -s foo/bar.txt /home/beau/bar.txt
pqnet

Antworten:

62

Wenn Sie einen symbolischen Link zu einem relativen Pfad erstellen, wird dieser als relativer symbolischer Link gespeichert, der nicht absolut ist, wie in Ihrem Beispiel gezeigt. Dies ist im Allgemeinen eine gute Sache. Absolute symbolische Links funktionieren nicht, wenn das Dateisystem an einer anderen Stelle angehängt ist.

Der Grund, warum Ihr Beispiel nicht funktioniert, ist, dass es relativ zum übergeordneten Verzeichnis der symbolischen Verknüpfung ist und nicht, wo ausgeführt lnwird.

Du kannst tun:

$ pwd
/home/beau
$ ln -s foo/bar.txt bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

Oder für das zählt:

$ cd foo
$ ln -s foo/bar.txt ../bar.txt

Es ist wichtig zu wissen, dass das erste Argument danach ln -sals Ziel des Symlinks gespeichert wird. Es kann sich um eine beliebige Zeichenfolge handeln (mit der einzigen Einschränkung, dass sie nicht leer sein darf und das Zeichen NUL nicht enthalten darf). Zum Zeitpunkt der Verwendung und Auflösung des Symlinks wird diese Zeichenfolge jedoch als relativer Pfad zu der Zeichenfolge verstanden Übergeordnetes Verzeichnis des Symlinks (wenn es nicht mit beginnt /).

penguin359
quelle
2
Schön gesagt. Du hast das beantwortet, während ich meine eigene Antwort getippt habe. :)
Shadur
Ich hatte nur eine etwas andere Frage - und diese beantwortet sie perfekt. Ich wollte wissen, wie ich auf das Home-Verzeichnis in symlink verweisen kann, damit es funktioniert, wenn ich es von einem Benutzer auf einen anderen übertrage. Ich war mir nicht sicher, ob so etwas ~funktionieren würde.
Joe
"Dieser String wird als relativer Pfad zum übergeordneten Verzeichnis des Symlinks verstanden" - das erklärt alles!
Bojan Komazec
24

Wenn Sie neuere Coreutils verwenden (ich verwende Coreutils-8.22-11), gibt es eine Option, um dies zu tun:

ln --help | grep relative

kann beliebigen Text enthalten; Wenn der Fehler später behoben wird, ist ein relativer Link -r, --relativ. Erstellen Sie symbolische Links relativ zur Position des Links

Zum Beispiel:

$ mkdir /tmp/test
$ touch /tmp/test/to
$ ln -rs /tmp/test/to /tmp/test/from
$ ls -l /tmp/test/from
    lrwxrwxrwx 1 ptr ptr 4 aug   25 17.02 /tmp/test/to -> from
ptr
quelle
Hm, für mich scheint es keine solche Option zu geben -r. Mac benutzen.
IVKREMER
1
@ivkremer es scheint diese Option verfügbar ist , da coreutils> = 8,16 (Quelle: superuser.com/a/837935/403979 )
DJCrashdummy
Die Verwendung der relativen Flagge schien die Probleme mit "zu vielen Ebenen symbolischer Verknüpfungen", die ich hatte, zu klären.
Vix
12

Entschuldige Nein. Symbolische Links beziehen sich auf den Ort, an dem sich der Link befindet, nicht auf den Ort, an dem Sie den Link erstellt haben. Für dieses Verhalten gibt es mehrere gute Gründe. Die meisten betreffen das Mounten entfernter Dateisysteme.

Shadur
quelle
7

Es gibt ein praktisches kleines Hilfsprogramm namens symlinks(ursprünglich von Mark Lords, jetzt von J. Brandt Buckley gepflegt), das in vielen Linux-Distributionen enthalten ist.

So konvertieren Sie alle absoluten symbolischen Links in einem Verzeichnis in relative Links:

symlinks -c /path/to/directory

Leider gibt es keine Möglichkeit, einen einzelnen Link zu konvertieren. Sie müssen ihn zuerst in ein eigenes Verzeichnis verschieben.

mkdir ../tmp
mv link-to-relativize ../tmp
symlinks ../tmp
mv ../tmp/* .
rmdir ../tmp
Gilles 'SO - hör auf böse zu sein'
quelle
Vielen Dank. Symlinks auf Github verfügbar . Gepflegt von J. Brandt Buckley. v1.4.3 .
Evgeny Vereshchagin
3

Du könntest es versuchen:

ln -s `pwd`/bar.txt /home/beau/bar.txt

Es wird jedoch eine symbolische Verknüpfung zum absoluten Pfadnamen hergestellt. In Ihrer Textfrage wird nach dem relativen Pfadnamen gefragt ...

Normalerweise ist ein relativer Pfadname das, was Sie wollen und was ln -sSie erhalten. Ich denke, was Sie wollen, ist:

cd /home/beau
ln -s foo/bar.txt bar.txt
MattBianco
quelle
1

Da die gängigsten Shells Pfade erweitern, sollten Sie zum Erstellen eines relativen Symlinks den "Quellpfad" angeben.

Auch der -sParameter bedeutet --symbolic. lnErstellt standardmäßig feste Links.

$ ln -s '../../relative_path' path
$ ls -al path

lrwxrwxrwx 1 empjustine empjustine 19 Aug  6 01:38 path -> ../../relative/path
emp.justine
quelle
0

Wenn Sie sicher sind, dass sich Ihre Mount-Punkte nicht ändern können, können Sie das erreichen, was Sie in einer Bash-Shell versuchen:

ln -s `pwd`/bar.txt ~/bar.txt

Dies setzt voraus, dass Sie sich beim Herstellen der symbolischen Verknüpfung im Zielverzeichnis befinden.

mreff555
quelle