Символические ссылки на символические ссылки ... частичная канонизация - PullRequest
1 голос
/ 23 июля 2011

Предположим, я создаю символическую ссылку "file2" на файл "file1" в двух каталогах над текущим местоположением (например, "ln -s ../../file1 file2". Но теперь предположим, что "file1" такжесимволическая ссылка на файл "file0" в двух каталогах ниже его местоположения (скажем, его относительный путь - dir1 / dir2 / file0 ").

Я бы предпочел, если бы символическая ссылка" file1 "содержала относительный URLпереход к файлу0 "../../dir1/dir2/file0", а не просто "../../file1". Этот последний только косвенно указывает на файл.

Какой хороший способ сделатьэто?

Я мог бы что-то взломать с помощью readlink. Но я все еще надеюсь, что есть "лучший" способ, который я не рассматриваю или упустил из виду.

Ответы [ 3 ]

1 голос
/ 01 августа 2011

Это будет рекурсивно протестировать файл и получить полный относительный путь, затем удалить ненужные "./" и "foo /../"

#!/bin/bash
linkfile="$1"
while test -L "$linkfile" ; do
linkfile="$(dirname ${linkfile})/$(readlink ${linkfile})"
done
perl -e '$x=shift; while ($x =~ s#//+#/#g) {} ; while ($x =~ s#/\./#/#g) {} ; while ($x =~ s#/([^\.]|[^\.][^/]+?|\.[^\.]+?)/\.\./#/#g) {} ; while ($x =~ s#^([^\.]|[^\.][^/]+?|\.[^\.]+?)/\.\./#/#g) {} ; $x =~ s#^\./##; print "$x\n";' "$linkfile"

Если вы сохраните это как" canonical.bash ", затем вы используете его

$ ln -s `canonical.bash foo` bar

Регулярное выражение не уменьшит несколько случаев, таких как "/..x/../" и "../foo/" (если foo / находится в вашем $PWD), но в противном случае он должен быть прочным.

0 голосов
/ 23 июля 2011

Теперь я помню !! Я видел утилиту, которая выполняет это около 15 лет назад! Смотрите man symlinks(1)! symlinks -c. Если это не то, что вы хотите, я полагаю, что ваши потребности настолько специфичны, что вам придется кодировать его самостоятельно ... (если я хорошо помню, я также создал некоторую утилиту для обработки символических ссылок на моем диске ...). PERL - отличный язык для этого.

0 голосов
/ 23 июля 2011

Нет, это настолько конкретно, что я думаю, что вам придется использовать readlink и реализовать его самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...