Коли у вас є посилання типу:
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