як оновити символічну ціль посилання (ln -f -s не працює)


45

Я використовую

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

оновити символічне посилання "додаток-поточний" з новим пунктом призначення. Однак це не працює, посилання "app-current" зберігає його вихідне місце призначення, однак я не отримую жодних помилок ...

Я вважаю за краще не видаляти посилання та відтворювати його, а лише оновити ціль наявного посилання. Це можливо?

Відповіді:


55

Це працює для мене, який результат strace ln -f -s /var/www/html/releases/build1390 app-current?

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

Наприклад, якщо arf вже вказує на / home:

страйк -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

Тож без -nарфи стає обережною, тому ln трактує її як 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

1
має найбільш правильну та лаконічну відповідь для користувачів Linux.
ross

Чи є спосіб змусити перезаписати цільовий каталог, щоб ви не отримали повідомлення про помилку cannot overwrite directory?
gitaarik

@rednaw Ви можете це зробити, з'єднавши пару команд, але lnсам не видаляє каталоги - це, мабуть, буде поганою ідеєю, оскільки це вимагатиме рекурсивного видалення можливо величезної кількості файлів.
augurar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.