Я пытаюсь использовать символические ссылки. Я немного почитал и нашел следующие команды:
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
Цитируя вас:
Я читал здесь и там, что невозможно обновить / переопределить символическую ссылку. Так что в сети есть противоречивая информация. Кто прав? Если символическую ссылку можно обновить / переопределить, как я могу этого добиться?
Отвечая на ваш вопрос «Кто прав», я не уверен, что именно вы читали и как это было понято. Но следующее должно помочь прояснить ситуацию:
Обновление символических ссылок с целевыми объектами, не являющимися каталогами.
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