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


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

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}
Deletion -> rm {link-name}

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

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

Обновить

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

~/scripts/test/
~/scripts/test/remote_loc/
~/scripts/test/remote_loc/site1/
~/scripts/test/remote_loc/site1/stuff1.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site2/stuff2.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site3/stuff3.txt

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

ln -s /remote_loc/site1 test_link

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

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


140
2018-05-17 12:39


Источник


Я рекомендую использовать unlink вместо rm, С unlink вы никогда не рискуете потерять файлы в исходном каталоге, случайно используя неправильные переключатели. - Jpsy
Вы используете ведущую / в вашей команде - Jamie Cook
@jpsy ваши советы о unlink было бы очень хорошо, если это правда, Попробуйте нажать zzzz; unlink zzzz. (unlink calls, unlink, такие же, как и rm, но без каких-либо причудливых опций и без рекурсии). - ctrl-alt-delor
Почему использование -n? (может быть, и проблема). Также, если ваш ln поддерживает -t затем используйте его для этих случаев и -T или destination/ для других случаев. - ctrl-alt-delor


Ответы:


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


119
2018-05-17 12:49



Я обновил свой вопрос с дополнительной информацией по моей проблеме. - Jérôme Verstrynge
Я под Linux. - Jérôme Verstrynge
Если вы переключите ln параметров, поскольку я склонен это делать, будет -f отключить существующие файлы (целевые ссылки)? В любом случае у нас есть -i параметр (который также предложит пользователю перезаписать), если вы хотите немного безопасности. - palswim
@palswim Это сообщение SO означает, что оно безопасно, потому что -f просто звонит unlink() а также link() под капотом: stackoverflow.com/a/1466570/157385, Хотелось бы, чтобы я только помню правильный порядок! - Mike Branski
Не работает. потребности -n, См. Принятый ответ. - Shawn Welch


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

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

Creation -> ln -s {path/to/file-name} {link-name}
Update -> ln -sfn {path/to/file-name} {link-name}

вместо

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}

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


85
2018-05-17 13:32



Для получения дополнительной информации о том, почему это так, различия заключаются в следующем: relative путь (без ведущего /), а другой - absolute путь (с ведущим /). Если вы управляете системой Linux, она КРИТИЧЕСКАЯ, вы понимаете различия. Например, разница между rm -rf ./* а также rm -rf /.* решает, сохраняете ли вы свою работу или нет :) - Safado
Это не отвечает на вопрос «как обновить / переопределить символическую ссылку» - Sirch
Строка ln -sfn {path / to / file-name} {link-name}. - Jérôme Verstrynge
Какая разница -n вариант сделать? - dokaspar
-n (--no-dereference) позволяет обрабатывать {link name} как обычный файл, а не следовать ссылке. Учитывая, что вам нужно работать по этой ссылке, не следуйте ей, вы должны использовать эту опцию. - feldoh


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

Цитирую вас:

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

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

~ / 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 test
 -rw-r--r-- 1    0 Jun  8 17:19 test
 lrwxrwxrwx 1    9 Jun  8 17:27 test.link -> /tmp/test

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


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

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

Пример:

ln -sfr /tmp/test  /tmp/test.link  ; ls -go /tmp| grep test
-rw-r--r-- 1    0 Jun  8 17:19 test
lrwxrwxrwx 1    4 Jun  8 17:27 test.link -> test

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

Пример:

ln -sf /tmp/testdir  /tmp/testdir.link  ; ls -go /tmp  |grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  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 Jun  8 17:48 testdir
lrwxrwxrwx 1   12 Jun  8 17:48 testdir.link -> /tmp/testdir

В отличие от:

ln -sfnr /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:48 testdir.link -> testdir

9
2018-06-08 22:58





$ 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

5
2018-05-17 12:42



Когда я выполняю тесты с 1 уровнем каталога, он работает, но я пытаюсь использовать многоуровневые каталоги, и он не работает. Я обновил свой вопрос. - Jérôme Verstrynge