Назад | Перейти на главную страницу

Как переопределить / обновить символическую ссылку?

Я пытаюсь использовать символические ссылки. Я немного почитал и нашел следующие команды:

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

а test_link создан, и я могу ls -l это, но кажется сломанным (вопреки тому, что я сказал выше в моем вопросе).

Как я могу выполнить ссылку на несколько уровней каталогов?

С помощью -f с участием ln перезапишет любую ссылку, которая уже была там, поэтому, пока у вас есть правильные разрешения, она должна работать ... У меня это всегда срабатывало. Какую операционную систему ты используешь?

Хорошо, я нашел, где моя ошибка: не следует ставить первую / в пути.

Другими словами, команды в моих вопросах должны быть:

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}

учитывая мой случай.

Первый выпуск:

Цитируя вас:

Создание и удаление работают нормально. Но обновления не работают. После выполнения этой команды символическая ссылка становится недействительной.

Проблема с данной структурой каталогов:

~ / 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

и используя команду:

ln -s /remote_loc/site1 test_link

В том, что он создает символическую ссылку в вашем $ PWD или текущем рабочем каталоге, которая указывает на несуществующий файл в / или корне в / remote_loc / site1

Если ваш PWD находится в ~ / scripts /, вам следовало использовать это:

ln -s remote_loc/site1 test_link

иначе вы могли бы использовать полный абсолютный путь, например:

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

Вторая проблема:

Цитируя вас:

Я читал здесь и там, что невозможно обновить / переопределить символическую ссылку. Так что в сети есть противоречивая информация. Кто прав? Если символическую ссылку можно обновить / переопределить, как я могу этого добиться?

Отвечая на ваш вопрос «Кто прав», я не уверен, что именно вы читали и как это было понято. Но следующее должно помочь прояснить ситуацию:

  1. Что можно обновлять и
  2. Что нельзя обновить без использования соответствующих переключателей.


Обновление символических ссылок с целевыми объектами, не являющимися каталогами.

ln -sf:
-F или --force удалить существующие файлы назначения. Это используется для обновления цели или назначения ссылки.

Пример:

 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 или --relative создает символические ссылки относительно местоположения ссылки.

Пример:

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приведенный выше аргумент без опции -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
$ 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