Как переопределить /обновить символическую ссылку?
Я пытаюсь использовать символические ссылки. Я прочитал несколько команд и нашел следующие команды:
Creation -> ln -s {/путь /в /имя-файла} {link-name}
Обновление -> ln -sfn {/путь /в /имя-файла} {link-name}
Удаление -> rm {link-name}
Создания и удаления работают нормально. Но обновления не работают. После выполнения этой команды символьная ссылка становится недействительной.
Я читал здесь и там, что невозможно обновить /переопределить символическую ссылку. Таким образом, в сети есть противоречивая информация. Кто прав? Если символическая ссылка может быть обновлена /переопределена, как я могу это достичь?
Обновление
Вот моя структура каталогов:
~ /скрипты /тест /
~ /Скрипты /тест /remote_loc /
~ /Скрипты /тест /remote_loc /site1 /
~ /Скрипты /тест /remote_loc /site1 /stuff1.txt
~ /Скрипты /тест /remote_loc /site2 /
~ /Скрипты /тест /remote_loc /site2 /stuff2.txt
~ /Скрипты /тест /remote_loc /site2 /
~ /Скрипты /тест /remote_loc /site3 /stuff3.txt
Из ~ /scripts /test /
, когда я выполняю:
ln -s /remote_loc /site1 test_link
a test_link
, и я могу ls -l
его, но он кажется сломанным (вопреки тому, что я сказал выше в моем вопросе).
Как я могу выполнить ссылку на несколько уровней каталога?
4 ответа
Хорошо, я обнаружил, где моя ошибка: нельзя вставлять первый /
в путь.
Другими словами, команды в моих вопросах должны быть:
Creation -> ln -s {path /to /file-name} {link-name}
Обновление -> ln -sfn {путь /в /имя-файла} {link-name}
вместо
Creation -> ln -s {/путь /в /имя-файла} {link-name}
Обновление -> ln -sfn {/путь /в /имя-файла} {link-name}
учитывая мой случай.
С помощью -f
с ln
будет перезаписана любая ссылка, которая уже была там, так что если у вас есть правильные разрешения, она должна работать ... Это всегда работает для меня. Какую операционную систему вы используете?
Первая проблема:
Цитата:
Создания и удаления работают нормально. Но обновления не работают. После выполняя эту команду, символическая ссылка становится недействительной.
Проблема С данной структурой каталогов:
~ /scripts /test /~ /scripts /test /remote_loc / ~ /Скрипты /тест /remote_loc /site1 / ~ /Скрипты /тест /remote_loc /site1 /stuff1.txt ~ /Скрипты /тест /remote_loc /site2 / ~ /Скрипты /тест /remote_loc /site2 /stuff2.txt ~ /Скрипты /тест /remote_loc /site2 / ~ /Скрипты /тест /remote_loc /site3 /stuff3.txt
и используя команду:
ln -s /remote_loc /site1 test_link
Это то, что он создает символическую ссылку в вашем PWD или настоящем рабочем каталоге, который указывает на несуществующий файл с /или root на /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
-rw-r - r-- 1 0 8 июн 17:19 test
lrwxrwxrwx 1 9 июня 8 17:27 test.link -> /TMP /тест
Но, как вы можете видеть, это даст абсолютный путь, если абсолютные пути находятся в аргументах ln
. Предоставление полного пути необходимо, если текущий рабочий каталог отличается от родительского каталога ссылки.
Относительные пути:
ln -sfr:
-R или -relative создает символические ссылки относительно местоположения ссылки.
Пример:
ln -sfr /tmp /test /tmp/test.link; ls -go /tmp | тест grep
-rw-r - r-- 1 0 8 июн 17:19 test
lrwxrwxrwx 1 4 июня 8 17:27 test.link -> контрольная работа
Но обновление ссылки на каталог не будет работать, если целью является каталог.
Пример:
ln -sf /tmp /testdir /tmp/testdir.link; ls -go /tmp | grep testdir
drwxr-xr-x 2 4096 8 июн 17:48 testdir
lrwxrwxrwx 1 7 июня 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 8 июн 17:48 testdir
lrwxrwxrwx 1 12 июня 8 17:48 testdir.link -> /TMP /testdir
В отличие от:
ln -sfnr /tmp /testdir /tmp/testdir.link; ls -go /tmp | grep testdir
drwxr-xr-x 2 4096 8 июн 17:48 testdir
lrwxrwxrwx 1 7 июня 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