Используйте -f
отметьте для печати канонизированной версии. Например:
readlink -f /root/Public/myothertextfile.txt
От man readlink
:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
readlink является командой, которую Вы хотите. Необходимо посмотреть на страницу справочника для команды. Поскольку, если Вы хотите следовать за цепочкой символьных ссылок на фактический файл, затем Вам нужны-e или переключатель-f:
$ ln -s foooooo zipzip # fooooo doesn't actually exist
$ ln -s zipzip zapzap
$ # Follows it, but doesn't let you know the file doesn't actually exist
$ readlink -f zapzap
/home/kbrandt/scrap/foooooo
$ # Follows it, but file not there
$ readlink -e zapzap
$ # Follows it, but just to the next symlink
$ readlink zapzap
zipzip
Это будет также работать:
ls -l /root/Public/myothertextfile.txt
но readlink
был бы предпочтен для использования в сценарии вместо парсинга ls
.
Если вы не можете использовать readlink
, то синтаксический анализ результата ls -l
может быть выполнен следующим образом.
Нормальный результат будет be:
ls -l /root/Public/myothertextfile.txt
lrwxrwxrwx 1 root root 30 Jan 1 12:00 /root/Public/myothertextfile.txt -> /root/Public/mytextfile.txt
Итак, мы хотим заменить все перед "->" и включенной стрелкой. Мы могли бы использовать для этого sed
:
ls -l /root/Public/myothertextfile.txt | sed 's/^.* -> //'
/root/Public/mytextfile.txt
Если вы хотите показать источник и назначение ссылки, попробуйте stat -c% N files *
. Например,
$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’
Он не подходит для синтаксического анализа (используйте для этого readlink
), но он показывает имя ссылки и место назначения, без беспорядка ls -l
-c
может быть записанный - формат
и % N
означает «имя файла в кавычках с разыменованием при символической ссылке».
Ссылка для чтения
- хорошая вещь, но она специфична для GNU и не является кроссплатформенной. Раньше я писал кроссплатформенные сценарии для / bin / sh
, поэтому я бы использовал что-то вроде:
ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'
или:
ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'
, но их нужно протестировать на разных платформах. Я думаю, что они будут работать, но не уверен на 100% для формата вывода ls
.
Результат ls
также можно проанализировать в bash
вне зависимости от внешней команды, такой как awk
, sed
или perl
.
Эта функция bash_realpath
, разрешает конечный пункт назначения ссылка (ссылка → ссылка → ссылка → финал):
bash_realpath() {
# print the resolved path
# @params
# 1: the path to resolve
# @return
# >&1: the resolved link path
local path="${1}"
while [[ -L ${path} && "$(ls -l "${path}")" =~ -\>\ (.*) ]]
do
path="${BASH_REMATCH[1]}"
done
echo "${path}"
}
ll
или ls -l
должен перечислить элементы каталога, включая вашу символическую ссылку и ее цель
cd -P /root/Public/myothertextfile.txt
(в вашем случае) должен указывать на исходный путь
Если вы найдете цель всех ссылок в папке и ее подпапке, используйте команду find. -type l -ls
команда с типом ссылки следующим образом:
me@local.localdomain:~/test$ find . -type l -ls
8601855888 0 lrwxr-xr-x 1 me staff 6 Jan 24 19:53 ./link -> target
Если вы хотите, чтобы цель была одиночной, тогда ls -l
должен работать:
me@local.localdomain:~/test$ ls -l
total 0
lrwxr-xr-x 1 me staff 6 Jan 24 19:53 link -> target
-rw-r--r-- 1 me staff 0 Jan 24 19:53 target
Вопрос недостаточно точен, чтобы дать простой ответ, такой как у brian-brazil:
readlink -f some_path
действительно разыменует каждую символическую ссылку в конструкции пути на конечную цель позади some_path
.
Но один уровень каскадных символических ссылок - это просто частный случай среди других в системе, общий случай - это N уровней каскадных символических ссылок. Посмотрите на мою систему:
$ rwhich emacs
/usr/bin/emacs
/etc/alternatives/emacs
/usr/bin/emacs24-x
rwhich
- моя собственная рекурсивная реализация , которая
выводит все промежуточные каскадные символические ссылки (на stderr) вплоть до конечной цели (на stdout).
Тогда, если я хочу знать, что такое:
цель символической ссылки / usr / bin / emacs **, очевидным ответом для меня будет / etc / alternatives / emacs
как возвращается:
readlink $ (который emacs)
ссылка для чтения / usr / bin / emacs
конечная конечная цель за каскадными символическими ссылками / usr / bin / emacs, ответ будет / usr / bin / emacs24-x
, возвращенный:
readlink -f $ (который emacs)
readlink -f / usr / bin / emacs
rwhich emacs 2> / dev / null