Як замінити / оновити символьне посилання?


187

Я намагаюся використовувати символічні посилання. Я прочитав декілька команд:

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}
Deletion -> rm {link-name}

Створення та видалення працюють чудово. Але оновлення не працюють. Після виконання цієї команди символьне посилання стає недійсним.

Я читав тут і там, що неможливо оновити / замінити симпосилання. Так що в мережі є суперечлива інформація. Хто правий? Якщо символьне посилання можна оновити / змінити, як я можу цього досягти?

Оновлення

Ось моя структура каталогу:

~/scripts/test/
~/scripts/test/remote_loc/
~/scripts/test/remote_loc/site1/
~/scripts/test/remote_loc/site1/stuff1.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site2/stuff2.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site3/stuff3.txt

Від ~/scripts/test/, коли я виконую:

ln -s /remote_loc/site1 test_link

a test_linkстворено, і я можу ls -l, але це здається порушеним (всупереч тому, що я говорив вище у своєму запитанні).

Як я можу виконати декілька посилань на рівні каталогів?


1
Рекомендую використовувати unlinkзамість rm. З unlinkвами ніколи не ризикує втратити будь - які файли в вихідному каталозі випадково використовуючи неправильні ключі.
Jpsy

Ви використовуєте ведучого / у своїй команді
Джеймі Кук

@jpsy, ваша порада щодо відключення була б дуже хорошою, якби це було правдою . Спробуйте touch zzzz; від’єднати zzzz. (від'єднати дзвінки, від’єднати те саме, що і rm, але без фантазійних варіантів і без рекурсії).
ctrl-alt-delor

Навіщо використовувати -n? (може бути проблема). Крім того, якщо ваш пров підтримує -tпотім використовувати його для цих випадків, і -Tчи destination/для інших випадків.
ctrl-alt-delor

Відповіді:


150

Використання -fс lnперезаписує будь-яке посилання, яке вже було там, так що, поки у вас є правильні дозволи, воно повинно працювати ... Це для мене завжди працює. Яку операційну систему ви використовуєте?


Я оновив своє запитання, щоб отримати більше інформації щодо мого питання.
Jérôme Verstrynge

Я під Linux.
Jérôme Verstrynge

2
Якщо ви переключите lnпараметри, як я схильний робити, чи -fперемикач знищить ваші існуючі файли (цілі посилань)? У будь-якому випадку у нас є -iпараметр (який спонукає користувача до перезапису), якщо ви хочете трохи захистити.
palswim

2
@palswim Ця публікація "ТАК" означає, що це безпечно, оскільки -fпросто дзвінки unlink()та link()під кришкою: stackoverflow.com/a/1466570/157385 . Я б хотів, щоб я просто пам'ятав правильний порядок, хоча!
Майк Бранський,

4
Не працює. Потреби -n. Дивіться прийняту відповідь.
Шон Уелч

118

Гаразд, я знайшов, де моя помилка: не слід ставити першим /на шлях.

Іншими словами, команди в моїх запитаннях повинні бути:

Creation -> ln -s {path/to/file-name} {link-name}
Update -> ln -sfn {path/to/file-name} {link-name}

замість

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}

розглядаючи мій випадок.


22
Для отримання додаткової інформації про те, чому це відбувається, відмінності: один - це relativeшлях (без ведучого /), а інший - absoluteшлях (з ведучим /). Якщо ви керуєте системою Linux, то критично ви розумієте відмінності. Наприклад, різниця між rm -rf ./*і rm -rf /.*вирішує, чи будете ви працювати чи ні :)
Сафадо

5
Це не дає відповіді на питання "як оновити /
перекрити симпосилання

Рядок ln -sfn {path / to / file-name} {link-name}.
Jérôme Verstrynge

6
-n (--no-dereference) змушує сприймати {link name} як звичайний файл, а не після цього посилання. Зважаючи на те, що вам потрібно діяти за цим посиланням, а не переходити за ним, ви повинні використовувати цю опцію.
feldoh

1
Ця відповідь має бути виділеною відповіддю з -nпараметром для заміни символьного посилання.
Нік Цай

12

Перший випуск:

Цитую вас:

Створення та видалення працюють чудово. Але оновлення не працюють. Після виконання цієї команди символьне посилання стає недійсним.

Проблема із заданою структурою каталогу:

~ / script / test / ~ / script / test / remote_loc / ~ / script / test / remote_loc / site1 / ~ / scriptpts / test / remote_loc / site1 / stuff1.txt ~ / scriptpts / test / remote_loc / site2 / ~ / script /test/remote_loc/site2/stuff2.txt ~ / script / test / remote_loc / site2 / ~ / script / test / remote_loc / site3 / stuff3.txt

і за допомогою команди:

ln -s /remote_loc/site1 test_link

Це створює символічне посилання у вашому $ PWD або в поточному робочому каталозі, яке вказує на неіснуючий файл із / або root або за адресою / remote_loc / site1

Якщо ваш PWD знаходиться у ~ / script /, тоді ви повинні використовувати це:

ln -s remote_loc/site1 test_link

інакше ви могли використовувати повний абсолютний шлях, як-от:

ln -s /home/yourusername/remote_loc/site1 test_link

Другий випуск:

Цитую вас:

Я читав тут і там, що неможливо оновити / замінити симпосилання. Так що в мережі є суперечлива інформація. Хто правий? Якщо символьне посилання можна оновити / змінити, як я можу цього досягти?

Відповідаючи на ваше запитання "Хто правий", я не впевнений, що саме ви читали чи як це розуміли. Але наступне має допомогти прояснити:

  1. Що можна оновити, і
  2. Що не можна оновити без використання відповідних комутаторів.


Оновлення символічних посилань на цілі, які не є каталогами.

ln -sf:
-f або - примусово видалити наявні файли призначення. Це використовується для оновлення цілі або призначення посилання.

Приклад:

 ln -sf /tmp/test /tmp/test.link; ls -go /tmp |grep test
 -rw-r--r-- 1    0 Jun  8 17:19 test
 lrwxrwxrwx 1    9 Jun  8 17:27 test.link -> /tmp/test

Але, як бачите, це дасть абсолютний шлях, якщо абсолютні шляхи будуть в lnаргументах Росії. Надання повного шляху необхідно, коли поточний робочий каталог відрізняється від батьківського каталогу посилання.


Відносні шляхи:

ln -sfr:
-r або - відносний створює символічні посилання відносно місця посилання.

Приклад:

ln -sfr /tmp/test  /tmp/test.link  ; ls -go /tmp| grep test
-rw-r--r-- 1    0 Jun  8 17:19 test
lrwxrwxrwx 1    4 Jun  8 17:27 test.link -> test

Але оновлення посилання на каталог не працюватиме, якщо цільовим є каталог.

Приклад:

ln -sf /tmp/testdir  /tmp/testdir.link  ; ls -go /tmp  |grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:47 testdir.link -> testdir

Як ви бачите, незважаючи на використання абсолютних імен шляхів, наведених у lnаргументі s вище без параметра -r, символічне посилання все ще відносно посилання.


Оновіть посилання на каталоги:

ln -sfrn:
-n або --no-dereference трактує LINK_NAME як звичайний файл, якщо він є символічним посиланням на каталог.

Приклад:

ln -sfn /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1   12 Jun  8 17:48 testdir.link -> /tmp/testdir

На противагу:

ln -sfnr /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:48 testdir.link -> testdir

6
$ touch test1 test2
$ ln -sf test2 test1
$ ls -l test[12]
lrwxrwxrwx 1 user01 user01 5 2012-05-17 14:41 test1 -> test2
-rw-r--r-- 1 user01 user01 0 2012-05-17 14:41 test2

Коли я виконую тести з 1 рівнем каталогу, він працює, але я намагаюся використовувати багаторівневі каталоги, і це не працює. Я оновив своє запитання.
Jérôme Verstrynge
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.