Вопрос: как обновить цель символической ссылки (ln -f -s не работает)


я использую

ln -f -s   / Вар / WWW / HTML / релизы / build1390   приложение тока

для обновления символической ссылки «app-current» с новым местом назначения. Однако это не работает, ссылка «app-current» сохраняет исходное назначение, однако я не получаю никаких ошибок ...

Я бы предпочел не удалять ссылку и воссоздать ее, просто обновить цель существующей ссылки. Это возможно?


42
2018-06-03 11:32


Источник




Ответы:


Это работает для меня, каков результат strace ln -f -s /var/www/html/releases/build1390 app-current ?

О, поскольку это каталог, который вам нужно добавить -n без каких-либо разыменований, и это должно решить проблему. -f на самом деле больше удобнее, так как добавление -f просто вызывает его отключение в любом случае. Хотя я предполагаю, что это, вероятно, произойдет на несколько сотен мс быстрее в нормально загруженной системе.

Например, если arf уже указывает на / home:

strace С -n:

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

strace Без -n:

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

Таким образом, без -n arf разыменовывается, поэтому он рассматривает его как arf, как если бы он был на самом деле /, В вашем конкретном примере, если нет ошибки, я думаю, вы, вероятно, создали новую символическую ссылку внутри /var/www/html/releases/build1390 app-current и захочет очистить это.


52
2018-06-03 11:36



отлично, это -что это сделал. Большое спасибо! - solsol


Вы можете использовать -n или --no-dereference для предотвращения разыменования цели, если это символическая ссылка. Вы также можете использовать -T или --no-target-directory для обеспечения того, чтобы целевой файл всегда обрабатываться как обычный файл.

Это приводит к немногому поведению, как показано в следующем примере. предполагать src это файл, dirlink является символической ссылкой на каталог, и dir является фактическим каталогом.

С помощью -n:

  • ln -sfn src dirlink перезаписывает dirlink и связывает его с src
  • ln -sfn src dir создает ссылку dir/src -> src

С помощью -T:

  • ln -sfT src dirlink перезаписывает dirlink и связывает его с src
  • ln -sfT src dir появляется сообщение об ошибке: ln: ‘dir’: cannot overwrite directory

12
2017-07-11 10:30



имеет самый правильный и краткий ответ для пользователей Linux. - ross
Есть ли способ принудительно переписать целевой каталог, чтобы вы не получили сообщение об ошибке cannot overwrite directory? - rednaw
@rednaw Вы можете сделать это, объединив несколько команд, но ln сам не удаляет каталоги - это, вероятно, будет плохой идеей, потому что это потребует рекурсивного удаления возможно огромного количества файлов. - augurar