как обновить символическую цель ссылки (ln -f -s не работает)
45
я использую
ln -f -s / var / www / html / Releases / build1390 app-current
обновить символическую ссылку "app-current" новым назначением. Тем не менее, это не работает, ссылка «app-current» сохраняет исходное назначение, однако я не получаю никаких ошибок ...
Я бы предпочел не удалять ссылку и не создавать ее заново, просто обновить цель существующей ссылки. Это возможно?
Это работает для меня, что является выходом strace ln -f -s /var/www/html/releases/build1390 app-current?
О, так как это каталог, который вы должны добавить -nбез разыменования, и это должно решить проблему. -fэто действительно больше удобства, так как добавление -f просто приводит к тому, что он в любом случае отсоединяется. Хотя я думаю, что это произойдет на несколько сотен мс быстрее в нормально загруженной системе.
Таким образом, без -narf разыменовывается, так что он обрабатывает его как arf, как если бы он был на самом деле /. В вашем конкретном примере, если ошибки нет, я думаю, что вы, вероятно, создали новую символическую ссылку внутри /var/www/html/releases/build1390 app-currentи захотите ее исправить.
Вы можете использовать -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
имеет самый правильный и краткий ответ для пользователей Linux.
Росс
Есть ли способ принудительно перезаписать целевой каталог, чтобы вы не получили сообщение об ошибке cannot overwrite directory?
Гитаарик
@rednaw Вы можете сделать это, связав пару команд, но lnсами по себе не удаляют каталоги - это, вероятно, будет плохой идеей, потому что для этого потребуется рекурсивное удаление, возможно, огромного количества файлов.
Вы можете использовать
-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
источник
cannot overwrite directory
?ln
сами по себе не удаляют каталоги - это, вероятно, будет плохой идеей, потому что для этого потребуется рекурсивное удаление, возможно, огромного количества файлов.