По всей цепочке ссылок
реальный путь
реальный путь (1) дает вам абсолютный пункт назначения ссылки. Но это только дает вам окончательный место назначения, поэтому, если у вас есть цепочка ссылок, она покажет вам только путь к последнему реальному файлу/папке, на который в конечном итоге указывает цепочка.
Итак, в вашем случае, если ../../e/f/g/h
является реальным файлом или папкой, вы увидите абсолютный путь. Но если один из компонентов также является символической ссылкой, он будет рекурсивно сохраняться до тех пор, пока не разрешит все символические ссылки на пути.
ссылка для чтения
Вы также можете использовать ссылка для чтения(1)
команда с флагами -f или -e, которая даст вам результат, аналогичный реальный путь
.
-f, --canonicalize канонизировать, переходя по каждой символической ссылке в
каждый компонент данного имени рекурсивно;
все, кроме последнего компонента, должны существовать
-e, --canonicalize-существующие канонизировать, перейдя по каждой символической ссылке в
каждый компонент данного имени рекурсивно,
все компоненты должны существовать
Избегайте перехода по всей цепочке ссылок
Если я правильно понимаю, вы не хотите следовать по цепочке до последнего компонента, а хотите получить только абсолютный путь фактической ссылки. Это немного некрасиво, но вы можете сделать что-то вроде:
ССЫЛКА=./a/b/c/d
/usr/bin/realpath --no-symlinks "$(dirname ${LINK})/$(readlink ${LINK})"
Объяснение:
$ имя_каталога $LINK # имя_каталога ./a/b/c/d
./а/б/в
$ ссылка для чтения $LINK # ссылка для чтения ./a/b/c/d
../../e/f/g/h
$ echo "$(имя каталога ${LINK})/$(ссылка для чтения ${LINK})"
./a/b/c/../../e/f/g/h
$ /usr/bin/realpath --no-symlinks "$(dirname ${LINK})/$(readlink ${LINK})"
/дом/а/д/ж/г/ч
Если вы хотите видеть только ссылку, относящуюся к вашему CWD, вы можете добавить аргумент --relative-to:
$ /usr/bin/realpath --no-symlinks --relative-to ./ "$(dirname ${LINK})/$(readlink ${LINK})"
а/д/ж/г/ч
Использование поиска
Вы можете получить аргумент для команды realpath, которую я показал ранее, используя команду find:
$ find ./ -type l -printf "%h/%l\n"
./a/b/c/../../e/f/g/h
От человека найти:
%h Начальные каталоги имени файла (все, кроме последнего элемента). Если
имя файла не содержит косых черт (поскольку оно находится в текущем
каталог) спецификатор %h заменяется на ".".
%l Объект символической ссылки (пустая строка, если файл не является символической ссылкой).
Затем вы можете комбинировать его с командой realpath сверху.
$ find ./ -type l -printf "%h/%l\n" | xargs /usr/bin/realpath -s
/дом/а/д/ж/г/ч
Если вы хотите видеть только ссылку, относящуюся к вашему CWD:
$ find ./ -type l -printf "%h/%l\n" | xargs /usr/bin/realpath -s --относительно ./
а/д/ж/г/ч