Как переопределить /обновить символическую ссылку?

Я пытаюсь использовать символические ссылки. Я прочитал несколько команд и нашел следующие команды:

Creation -> ln -s {/путь /в /имя-файла} {link-name}
Обновление -> ln -sfn {/путь /в /имя-файла} {link-name}
Удаление -> rm {link-name}

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

Я читал здесь и там, что невозможно обновить /переопределить символическую ссылку. Таким образом, в сети есть противоречивая информация. Кто прав? Если символическая ссылка может быть обновлена ​​/переопределена, как я могу это достичь?

Обновление

Вот моя структура каталогов:

~ /скрипты /тест /
~ /Скрипты /тест /remote_loc /
~ /Скрипты /тест /remote_loc /site1 /
~ /Скрипты /тест /remote_loc /site1 /stuff1.txt
~ /Скрипты /тест /remote_loc /site2 /
~ /Скрипты /тест /remote_loc /site2 /stuff2.txt
~ /Скрипты /тест /remote_loc /site2 /
~ /Скрипты /тест /remote_loc /site3 /stuff3.txt

Из ~ /scripts /test /, когда я выполняю:

ln -s /remote_loc /site1 test_link

a test_link, и я могу ls -l его, но он кажется сломанным (вопреки тому, что я сказал выше в моем вопросе).

Как я могу выполнить ссылку на несколько уровней каталога?

140 голосов | спросил Jérôme Verstrynge 17 Maypm12 2012, 16:39:18

4 ответа


85

Хорошо, я обнаружил, где моя ошибка: нельзя вставлять первый / в путь.

Другими словами, команды в моих вопросах должны быть:

Creation -> ln -s {path /to /file-name} {link-name}
Обновление -> ln -sfn {путь /в /имя-файла} {link-name}

вместо

Creation -> ln -s {/путь /в /имя-файла} {link-name}
Обновление -> ln -sfn {/путь /в /имя-файла} {link-name}

учитывая мой случай.

ответил Jérôme Verstrynge 17 Maypm12 2012, 17:32:38
119

С помощью -f с ln будет перезаписана любая ссылка, которая уже была там, так что если у вас есть правильные разрешения, она должна работать ... Это всегда работает для меня. Какую операционную систему вы используете?

ответил Sirch 17 Maypm12 2012, 16:49:48
9

Первая проблема:

Цитата:

  

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

Проблема С данной структурой каталогов:

  

~ /scripts /test /~ /scripts /test /remote_loc /   ~ /Скрипты /тест /remote_loc /site1 /   ~ /Скрипты /тест /remote_loc /site1 /stuff1.txt   ~ /Скрипты /тест /remote_loc /site2 /   ~ /Скрипты /тест /remote_loc /site2 /stuff2.txt   ~ /Скрипты /тест /remote_loc /site2 /   ~ /Скрипты /тест /remote_loc /site3 /stuff3.txt

и используя команду:

  

ln -s /remote_loc /site1 test_link

Это то, что он создает символическую ссылку в вашем PWD или настоящем рабочем каталоге, который указывает на несуществующий файл с /или root на /remote_loc /site1

Если ваш PWD находится в ~ /scripts /, вы должны использовать это:

ln -s remote_loc /site1 test_link

иначе вы могли бы использовать полный абсолютный путь, например:

ln -s /home /yourusername /remote_loc /site1 test_link

Вторая проблема:

Цитата:

  

Я читал здесь и там, что невозможно обновить /переопределить   символическая ссылка. Таким образом, в сети есть противоречивая информация. Кто   правильно? Если символическая ссылка может быть обновлена ​​/переопределена, как я могу это достичь?

Отвечая на ваш вопрос «Кто прав», я не уверен, что именно вы читали или как его понимали. Но следующее должно помочь прояснить:

  1. Что можно обновить и
  2. Что нельзя обновить без использования соответствующие переключатели.


Обновление символических ссылок с целями, которые не являются каталогами.

  

ln -sf:
  -F или -force удаляет существующие файлы назначения. Это используется для обновления целевого объекта или пункта назначения.

Пример:

ln -sf /tmp /test /tmp/test.link; Тест ls -go /tmp | grep
 -rw-r - r-- 1 0 8 июн 17:19 test
 lrwxrwxrwx 1 9 июня 8 17:27 test.link -> /TMP /тест

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


Относительные пути:

  

ln -sfr:
  -R или -relative создает символические ссылки относительно местоположения ссылки.

Пример:

ln -sfr /tmp /test /tmp/test.link; ls -go /tmp | тест grep
-rw-r - r-- 1 0 8 июн 17:19 test
lrwxrwxrwx 1 4 июня 8 17:27 test.link -> контрольная работа

Но обновление ссылки на каталог не будет работать, если целью является каталог.

Пример:

ln -sf /tmp /testdir /tmp/testdir.link; ls -go /tmp | grep testdir
drwxr-xr-x 2 4096 8 июн 17:48 testdir
lrwxrwxrwx 1 7 июня 8 17:47 testdir.link -> testdir

Как вы можете видеть, несмотря на использование абсолютных имен путей, приведенных в аргументе ln выше, без параметра -r, символическая ссылка по-прежнему относится к ссылке.


Обновить ссылки на каталоги:

  

ln -sfrn:
  Параметр -n или --no-dereference рассматривает LINK_NAME как обычный файл, если он является символической ссылкой на каталог.

Пример:

ln -sfn /tmp /testdir /tmp/testdir.link; ls -go /tmp | grep testdir
drwxr-xr-x 2 4096 8 июн 17:48 testdir
lrwxrwxrwx 1 12 июня 8 17:48 testdir.link -> /TMP /testdir

В отличие от:

ln -sfnr /tmp /testdir /tmp/testdir.link; ls -go /tmp | grep testdir
drwxr-xr-x 2 4096 8 июн 17:48 testdir
lrwxrwxrwx 1 7 июня 8 17:48 testdir.link -> testdir
ответил Keith Reynolds 9 J0000006Europe/Moscow 2016, 01:58:01
5
$ touch test1 test2
$ ln -sf test2 test1
$ ls -l test [12]
lrwxrwxrwx 1 user01 user01 5 2012-05-17 14:41 test1 -> test2
-rw-r - r-- 1 user01 user01 0 2012-05-17 14:41 test2
ответил jirib 17 Maypm12 2012, 16:42:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132