Почему не работает моя символическая ссылка?

19

Я пытаюсь лучше понять символические ссылки ... и мне не очень повезло. Это мой фактический вывод оболочки с измененным именем пользователя / хостом:

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

Я думал, что символическая ссылка должна работать прозрачно, в том смысле, что вы можете работать с файлом, на который она указывает, как если бы вы обращались к файлу напрямую (за исключением, конечно, в случае rm где конечно ссылка просто удалена).

orokusaki
источник
Как отформатирован ваш диск? Какую файловую систему вы используете? (FAT не поддерживает символические ссылки, но если вы попытаетесь создать файловую систему FAT, это должно привести к ошибке.)
Nicole Hamilton
@NicoleHamilton - это ext4 (в соответствии с df -T ) - вам тоже странный результат выше?
orokusaki
@orokusaki Не странно. Смотрите мой ответ ниже. Просто один на один, не нужно трогать файлы, чтобы следить за ними. Им даже не нужно существовать. Просто чтобы сэкономить на печати!
nerdwaller

Ответы:

41

Симлинки, как правило, любят полные пути или относительно ссылки, в противном случае они часто могут искать file-1.txt локально (как ни странно).

Перейдите к proper и выполнить ls -l и вы можете увидеть, что символическая ссылка ищет actual/file-1.txtкогда это должно быть ../actual/file-1.txt,

Итак, у вас есть два варианта:

  1. Дайте полный путь

    ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
    
  2. Перейдите к папке, в которой вы хотите разместить ссылку, и ссылку оттуда

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

редактировать : Подсказка для сохранения ввода.

Вы могли бы просто сделать ln -s ~/actual/file-{1,2}.txt ~/proper

Элементы в фигурных скобках подставляются и располагаются друг за другом, создавая команду

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

который связывает оба файла с целевым каталогом. Сохраняет некоторые основные тип ввода по мере продвижения в оболочке.

nerdwaller
источник
2
Спасибо, я как раз собирался вырвать свои волосы, прежде чем прочитал твой ответ.
orokusaki
Это иногда смущает наверняка! Linux имеет тенденцию быть очень буквальным, поэтому, если вы скажете что-нибудь сделать - так и будет. Будьте осторожны с символическими ссылками на папки, поэтому я перезаписал одну или две раньше (просто укажите имя без косой черты) Кроме того, не rm -rf * в символическую папку - вы можете стереть папку, на которую она ссылается. Просто сделайте rm symlinkname. Просто несколько вещей, в которых я допустил ошибки: D
nerdwaller
2

Проблема заключается в использовании относительных путей. Если вы указываете создание ссылки с полным явным путем, это работает.

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

$ cat Proper / file1.txt

файл 1

$

Ваш пример создает ссылки в proper который ищет подкаталог с именем actual в текущем каталоге, а не в качестве предполагаемого родителя обоих.

Don Simon
источник
1

Символические ссылки могут быть хитрыми. По сути, символическая ссылка - это файл, который содержит имя файла / путь к другому файлу (и который помечен для специальной обработки). Если путь в файле ссылок начинается с ‘ / », Тогда он рассматривается как абсолютный путь, и все довольно просто. Если он не начинается с косой черты, он рассматривается как относительный путь - относительно каталога, в котором находится ссылка. (Это верно независимо от того, содержит ли имя косые черты.) Итак, вы создали proper/file–1.txt в качестве ссылки на « actual/file–1.txt », И когда вы пытались получить к нему доступ, система пыталась proper/actual/file–1.txt, Ты должен был сказать

ln –s  ../actual/file–1.txt  ../actual/file–2.txt  proper

Кстати, вам не нужно touch команды. echo "file 1" > actual/file–1.txt достаточно, чтобы создать actual/file–1.txt,

Scott
источник
0

Связанная проблема, и она может быть очевидна для многих, но поставила меня в тупик на несколько минут: если вы создаете символическую ссылку в каталоге, который сам является символической ссылкой, или есть символическая ссылка в пути текущего рабочего каталога, вы можете столкнуться с проблемами с неработающими символическими ссылками.

использование cd .. а также ls -l несколько раз, чтобы увидеть, если ваши родительские каталоги сами символические ссылки.

Если вам нужно создать символическую ссылку, cd в исходный каталог Target и создайте там новые символические ссылки, чтобы относительные пути были точными.

Или, если выразиться иначе: относительный путь - от начала до цели. Если источник впоследствии является символической ссылкой, это нормально. Но вы можете столкнуться с проблемами при настройке нового источника link_name в каталоге, который сам каким-то образом является символической ссылкой.

Chrisky
источник
1
Вместо " cd .. а также ls -l неоднократно ", вы могли бы использовать namei -mox $PWD, Другой полезный способ узнать, есть ли символические ссылки на пути, это использовать pwd -P, который дает вам путь к текущему каталогу, который не содержит символических ссылок (так что если pwd а также pwd -P дать другой вывод, вы знаете, что есть символическая ссылка где-то по пути).
Ansa211