Коли у вас є посилання типу:
link -> foo/bar
і хочете змінити його на:
link -> new/target
Слід розглянути два випадки:
foo/barне є каталогом або не існує, або ви не маєте доступу до пошуку foo. Потім
ln -s new/target link
не вдасться, тому що linkвже існує, але ви можете подолати це, використовуючи стандарт:
ln -fs new/target link
foo/barце каталог (і у вас є дозвіл на пошук, fooщоб мати можливість визначити, що foo/barце каталог). У тому випадку, коли ви робите:
ln -s new/target link
або
ln -fs new/target link
Це розуміється як створення нового targetсимвольного посилання всередині linkкаталогу ( linkце каталог, оскільки це символьне посилання на foo/barкаталог). Таким чином, ви фактично створите:
foo/bar/target -> new/target
Щоб подолати це, GNU lnмає -Tможливість ім'я посилання завжди розглядати як ім'я посилання, а не як каталог для створення посилань (и). Так, з GNU ln:
ln -fsT new/target link
буду працювати. Як і раніше, він видалить початкове linkсимвольне посилання та створить його заново new/targetяк ціль (і процес 'euid та egid як власник).
У GNU lnтакож є -nваріант. Це працює як -Tвиняток, коли linkнасправді це справжній каталог, і в цьому випадку він все одно створить симпосилання всередині цього каталогу (замість того, щоб не виходити з помилкою).
Портативно, найкращий варіант - спочатку видалити посилання, а потім відтворити його:
rm -f link && ln -s new/target link
У більшості систем дозволи на символьні посилання ігноруються і, як правило, фіксуються на rwxrwxrwx.
У системах, де значення дозволів для символьних посилань мають значення (наприклад, для OS / X, де вам потрібно дозволити читання, щоб мати змогу вирішити свою ціль), зазвичай існує спосіб їх зміни ( chmod -hдля OS / X).
Власність, хоча, як і вище, не стосується доступу до файлу, на який вказує символьна посилання в більшості систем, може мати інше значення, wrt tбіт батьківського каталогу або квоти ... ) і є стандартна команда для його зміни:
chown -h user[:group] the-link
chgrp -h group the-link