как обновить символическую цель ссылки (ln -f -s не работает)

45

я использую

ln -f -s / var / www / html / Releases / build1390 app-current

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

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

solsol
источник

Ответы:

55

Это работает для меня, что является выходом 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

Трассирование Без -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

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

Кайл Брандт
источник
4
отлично, это -n, что сделал это. Большое спасибо!
solsol
12

Вы можете использовать -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
augurar
источник
1
имеет самый правильный и краткий ответ для пользователей Linux.
Росс
Есть ли способ принудительно перезаписать целевой каталог, чтобы вы не получили сообщение об ошибке cannot overwrite directory?
Гитаарик
@rednaw Вы можете сделать это, связав пару команд, но lnсами по себе не удаляют каталоги - это, вероятно, будет плохой идеей, потому что для этого потребуется рекурсивное удаление, возможно, огромного количества файлов.
Авгурар