Как я могу создать относительную символьную ссылку, учитывая относительный путь?

unix не работает с пользователем / группой, он работает с uid / gid, вы меняете uid / gid, пожалуйста, исправьте новый uid / gui в своем домашнем каталоге: например:

chown 1002.1002 yourdir -R
1
20.03.2015, 01:06
3 ответа

Что-то вроде этого должно работать

file="/var/log/dmesg"
ln -s $file $(dirname $file)/../
0
27.01.2020, 23:50

Предполагая, что вы хотите создать:

/home/kostas/test/dir/hello/link -> /home/kostas/file/to/link

сим-ссылку (предполагая, что /home/kostas - это ваш текущий каталог), но используя относительную ссылку, то есть:

/home/kostas/test/dir/hello/link -> ../../../file/to/link

Тогда вы можете сделать (с помощью GNU ln):

$ current_path=test/dir/hello
$ parent_file_to_lunk=file/to/link
$ ln -rsvt "$current_path/" "$parent_file_to_lunk"
‘test/dir/hello/link’ -> ‘../../../file/to/link’

без GNU ln, но с GNU bash -O extglob или zsh -o kshglob или ksh93:

$ ln -s "${current_path//+([^\/])/..}/$parent_file_to_lunk" "$current_path/"

(обратите внимание, что предполагается, что компоненты $current_path сами по себе не являются симлинками)

:

$ ln -s "${current_path//+([^\/])/..}/$parent_file_to_lunk" "$current_path/"

(обратите внимание, что это предполагает, что компоненты $current_path не являются симлинками)

:

/home/kostas/test/dir/hello/link -> ../../../file/to/link

.

0
27.01.2020, 23:50

Попробуйте

parent_path=$(echo "$current_path"/ | sed -e "s|[^/]||g" -e "s|/|../|g")
cd "${current_path}" ; ln -s "${parent_path}${parent_file_to_link}"

Это работает просто путем подсчета косых черт в "$ {current_path}" . Требуемая глубина на единицу больше, чем количество косых черт (например, глубина test / dir / hello , содержащая две косые черты, равна 3), {{ 1}} поэтому мы просто добавляем косую черту: echo "$ current_path" / . Вставьте его в sed . Поскольку мы манипулируем косой чертой, проще использовать символ, отличный от / , в качестве разделителя для sed s команда; Мне нравится использовать вертикальную полосу ( | ). s | [^ /] || g находит все символы без косой черты и ничего не заменяет. Другими словами, он удаляет все символы, кроме косой черты. Итак, для значения "$ {current_path}" из test / dir / hello , мы echo 'd test / dir / hello / , а затем сократил это до /// . Затем s | / | ../ | g " меняет каждые / на ../ , поэтому мы получаем ../../../ .

Примечание: здесь предполагается, что "$ {current_path}" не содержит лишних (ненужных) косых черт. Например, test / dir // hello и test / dir / hello / логически эквивалентны test / dir / hello , , но они содержат вводящее в заблуждение количество символов косой черты , что повредит этот процесс.

PS Всегда заключайте в кавычки все переменные оболочки, если у вас нет причины не {{1} } и вы уверены, что знаете, что делаете.Использование фигурных скобок (как в $ { имя_переменной } ) не эквивалентно заключению в кавычки.

1
27.01.2020, 23:50

Теги

Похожие вопросы