Warum funktioniert mein symbolischer Link nicht?

24

Ich versuche, symbolische Verknüpfungen besser zu verstehen ... und habe nicht viel Glück. Dies ist meine aktuelle Shell-Ausgabe mit geändertem Benutzernamen / Host:

username@host:~$ mkdir actual
username@host:~$ mkdir proper
username@host:~$ touch actual/file-1.txt
username@host:~$ echo "file 1" > actual/file-1.txt
username@host:~$ touch actual/file-2.txt
username@host:~$ echo "file 2" > actual/file-2.txt
username@host:~$ ln -s actual/file-1.txt actual/file-2.txt proper
username@host:~$ # Now, try to use the files through their links
username@host:~$ cat proper/file-1.txt
cat: proper/file-1.txt: No such file or directory
username@host:~$ cat proper/file-2.txt
cat: proper/file-2.txt: No such file or directory
username@host:~$ # Check that actual files do in fact exist
username@host:~$ cat actual/file-1.txt
file 1
username@host:~$ cat actual/file-2.txt
file 2
username@host:~$ # Remove the links and go home :(
username@host:~$ rm proper/file-1.txt
username@host:~$ rm proper/file-2.txt

Ich dachte, dass ein symbolischer Link transparent funktionieren sollte, in dem Sinne, dass Sie die Datei bearbeiten könnten, auf die er verweist, als würden Sie direkt auf die Datei zugreifen (außer natürlich, wenn rmder Link einfach entfernt wird ).

orokusaki
quelle
Wie ist Ihre Festplatte formatiert? Welches Dateisystem verwenden Sie? (FAT unterstützt keine Symlinks, aber wenn Sie versuchen, auf einem FAT-Dateisystem zu erstellen, sollte es einen Fehler geben.)
Nicole Hamilton
@NicoleHamilton - Es ist ext4 (laut df -T) - ist das obige Ergebnis dann auch für Sie seltsam?
Orokusaki
@orokusaki Nicht seltsam. Siehe meine Antwort unten. Nur ein Köpfchen, keine Notwendigkeit, Dateien zu berühren, um sie anzugreifen. Sie müssen nicht einmal existieren. Nur um Ihnen das Tippen zu ersparen!
Nerdwaller

Antworten:

50

Symlinks mögen in der Regel vollständige Pfade oder beziehen sich auf den Link, andernfalls suchen sie häufig file-1.txtlokal (seltsamerweise).

Navigiere zu properund führe es aus ls -lund du kannst sehen, dass der Symlink danach sucht actual/file-1.txt, wann er sein sollte ../actual/file-1.txt.

Sie haben also zwei Möglichkeiten:

  1. Geben Sie den vollständigen Pfad an

    ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
  2. Navigieren Sie zu dem Ordner, in dem sich der Link befinden soll, und verknüpfen Sie ihn von dort aus

    cd proper
    ln -s ../actual/file-1.txt ../actual/file-2.txt ./

Bearbeiten : Ein Hinweis zum Speichern der Eingabe.

Du könntest es einfach tun ln -s ~/actual/file-{1,2}.txt ~/proper

Die Elemente in geschweiften Klammern werden ersetzt und nacheinander platziert, wodurch der Befehl erstellt wird

ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper

Dadurch werden beide Dateien mit dem Zielverzeichnis verknüpft. Spart einige wichtige Eingaben, während Sie in der Shell weitermachen.

Nerdwaller
quelle
2
Danke - ich wollte gerade meine Haare ausreißen, bevor ich deine Antwort las.
Orokusaki
1
Es ist manchmal sicher verwirrend! Linux ist in der Regel sehr wörtlich. Wenn Sie also sagen, dass Sie etwas tun sollen, wird dies der Fall sein. Vorsicht beim Verknüpfen von Ordnern auf diese Weise, ich habe ein oder zwei zuvor überschrieben (Geben Sie einfach den Namen ohne einen abschließenden Schrägstrich an). rm -rf *Vermeiden Sie es auch, auf einen symbolisch verknüpften Ordner zuzugreifen. Sie können den Ordner , auf den er verweist, löschen. Einfach rm symlinkname machen. Nur ein paar Dinge, bei denen ich Fehler gemacht habe: D
nerdwaller
3

Das Problem ist die Verwendung relativer Pfade. Wenn Sie Ihre Linkerstellung mit dem vollständigen expliziten Pfad angeben, funktioniert dies.

$ ln -s ~ / actual / file1.txt ~ / actual / file2.txt ~ / proper /

$ cat proper / file1.txt

datei 1

$

In Ihrem Beispiel werden Links erstellt proper, die nach einem Unterverzeichnis mit dem Namen actual im aktuellen Verzeichnis suchen, und nicht nach dem gewünschten übergeordneten Verzeichnis.

Don Simon
quelle
1

Symbolische Verknüpfungen können schwierig sein. Im Wesentlichen ist eine symbolische Verknüpfung eine Datei, die einen Dateinamen / Pfadnamen für eine andere Datei enthält (und die für eine Sonderbehandlung markiert ist). Wenn der Pfadname in der Linkdatei mit ' /' beginnt , wird er als absoluter Pfadname behandelt und die Dinge sind ziemlich einfach. Beginnt es nicht mit einem Schrägstrich, wird es als relativer Pfadname behandelt - relativ zu dem Verzeichnis, in dem sich der Link befindet. (Dies gilt unabhängig davon, ob der Name Schrägstriche enthält oder nicht.) Sie haben also proper/file–1.txteinen Link zu „ actual/file–1.txt“ erstellt, und als Sie versuchten, darauf zuzugreifen, hat das System versucht, darauf zuzugreifen proper/actual/file–1.txt. Du hättest sagen sollen

ln s  ../actual/file1.txt  ../actual/file2.txt  proper

Die touchBefehle haben Sie übrigens nicht gebraucht.  echo "file 1" > actual/file–1.txtist ausreichend zu schaffen actual/file–1.txt.

Scott
quelle
0

Ein verwandtes Problem, das für viele offensichtlich sein mag, das mich jedoch einige Minuten lang überrascht hat: Wenn Sie einen Symlink in einem Verzeichnis erstellen, das selbst als Symlink fungiert, oder wenn sich im Pfad des aktuellen Arbeitsverzeichnisses ein Symlink befindet, ist dies möglicherweise der Fall starte bei problemen mit nicht funktionierenden symlinks.

Verwenden Sie cd ..und ls -lwiederholt, um festzustellen, ob Ihre übergeordneten Verzeichnisse selbst miteinander verknüpft sind.

Wenn Sie einen Symlink cdzum ursprünglichen Zielverzeichnis erstellen und dort neue Symlinks erstellen müssen, sind die relativen Pfade korrekt.

Oder anders ausgedrückt: Der relative Pfad führt vom Ursprung zum Ziel. Wenn der Ursprung anschließend symbolisch verknüpft wird, ist das in Ordnung. Es kann jedoch vorkommen, dass Sie Probleme beim Einrichten eines neuen Origin-Linknamens in einem Verzeichnis haben, das selbst irgendwie mit einem Link verbunden ist.

Chrisky
quelle
1
Anstelle von " cd ..und ls -lwiederholt" könnten Sie verwenden namei -mox $PWD. Eine weitere nützliche Methode, um herauszufinden , ob es Symlinks auf dem Weg zum Einsatz ist pwd -P, mit dem Ihnen einen Pfad zum aktuellen Verzeichnis gibt , die keine symbolischen Links enthalten (also wenn pwdund pwd -Pgeben unterschiedlichen Ausgang, wissen Sie , es ist ein symbolischer Link irgendwo auf dem Weg ).
Ansa211,
0

Wenn Sie versuchen, einen Link zu einer Datei zu erstellen, die nicht existiert (oder den Pfad falsch angegeben hat), gibt ln -s keinen Fehler aus. Es wird ein Link erstellt, aber wenn Sie versuchen, "cat" für diesen Link zu verwenden, wird angezeigt, dass keine Datei gefunden wurde. Auch wenn Sie es mit ls sehen können. Überprüfen Sie in solchen Fällen immer Ihren Dateipfad.

ubuntu@ip-172-31-80-155:~/lab5$ ln -s etc/ufw/ufw.conf link1
ubuntu@ip-172-31-80-155:~/lab5$ ls -al
total 5360
drwxrwxr-x 2 ubuntu ubuntu    4096 Mar  9 18:56 .
drwxr-xr-x 7 ubuntu ubuntu    4096 Mar  9 18:42 ..
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link1
cat: link1: No such file or directory

Weil die Datei etc / ufw / ufw.conf nicht existiert. Der richtige Pfad lautet /etc/ufw/ufw.conf

ubuntu@ip-172-31-80-155:~/lab5$ ln -s /etc/ufw/ufw.conf link2
ubuntu@ip-172-31-80-155:~/lab5$ ls -l
total 5352
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
lrwxrwxrwx 1 ubuntu ubuntu      17 Mar  9 19:00 link2 -> /etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link2
# /etc/ufw/ufw.conf
#

# Set to yes to start on boot. If setting this remotely, be sure to add a rule
# to allow your remote connection before starting ufw. Eg: 'ufw allow 22/tcp'
ENABLED=no

# Please use the 'ufw' command to set the loglevel. Eg: 'ufw logging medium'.
# See 'man ufw' for details.
LOGLEVEL=low
sindhura
quelle
Es gibt bereits eine bessere Antwort, und der erste Teil, dass ln -s"manchmal" nicht auf die Existenz des Ziels geprüft wird, ist einfach falsch.
RalfFriedl