it-swarm.com.de

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

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 gerne dazu in der Lage sein:

$ 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 ln übergeben?

65
Humphrey Bogart

Wenn Sie eine symbolische Verknüpfung zu einem relativen Pfad erstellen, wird diese als relative symbolische Verknüpfung gespeichert, nicht absolut, wie in Ihrem Beispiel gezeigt. Dies ist im Allgemeinen eine gute Sache. Absolute symbolische Links funktionieren nicht, wenn das Dateisystem an einer anderen Stelle bereitgestellt wird.

Der Grund, warum Ihr Beispiel nicht funktioniert, ist, dass es sich auf das übergeordnete Verzeichnis des symbolischen Links bezieht und nicht darauf, wo ln ausgeführt wird.

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 dafür:

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

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

66
penguin359

Wenn Sie neuere Coreutils verwenden (ich verwende Coreutils-8.22-11), haben Sie die Möglichkeit, dies zu tun:

ln --help | grep relative

kann beliebigen Text enthalten; Wenn dies später behoben wird, ist ein relativer Link -r, --relative. Erstellen Sie symbolische Links relativ zum Linkstandort

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
25
ptr

Entschuldige Nein. Symbolische Links beziehen sich auf den Ort, an dem sich der Link befindet, und nicht auf den Ort, an dem Sie sich beim Erstellen des Links befanden. Es gibt mehrere gute Gründe für dieses Verhalten, von denen die meisten das Mounten von Remote-Dateisystemen beinhalten.

12
Shadur

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

So konvertieren Sie alle absoluten symbolischen Links in einem Verzeichnis als relativ:

symlinks -c /path/to/directory

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

mkdir ../tmp
mv link-to-relativize ../tmp
symlinks ../tmp
mv ../tmp/* .
rmdir ../tmp

Du könntest es versuchen:

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

Es stellt jedoch eine symbolische Verbindung zum absoluten Pfadnamen her. In Ihrer Textfrage werden relative Pfadnamen erwähnt ...

Normalerweise ist ein relativer Pfadname das, was Sie wollen und was ln -s gibt Ihnen. Ich denke, was Sie wollen, ist:

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

Da die am häufigsten verwendeten Shells Pfade erweitern, sollten Sie den "Quellpfad" angeben, um einen relativen Symlink zu erstellen.

Auch die -s Parameter bedeutet --symbolic. ln erstellt standardmäßig feste Links.

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

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

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

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

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

0
mreff555