unix не работает с пользователем / группой, он работает с uid / gid, вы меняете uid / gid, пожалуйста, исправьте новый uid / gui в своем домашнем каталоге: например:
chown 1002.1002 yourdir -R
Что-то вроде этого должно работать
file="/var/log/dmesg"
ln -s $file $(dirname $file)/../
Предполагая, что вы хотите создать:
/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
.
Попробуйте
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} } и вы уверены, что знаете, что делаете.Использование фигурных скобок
(как в $ { имя_переменной }
) не эквивалентно заключению в кавычки.