Скажем, я установил символическую ссылку:
ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt
есть ли способ узнать, что является целью myothertextfile.txt
использует командную строку?
Использовать -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
.
Если вы хотите показать источник и назначение ссылки, попробуйте 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
можно написать --format
и %N
означает «имя файла в кавычках с разыменованием при символической ссылке».
В readlink
это хорошая вещь, но специфичная для 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}"
}
Если вы не можете использовать readlink
, затем анализируя результат ls -l
можно было сделать вот так.
Нормальный результат будет:
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
Этот вопрос недостаточно точен, чтобы дать такой простой ответ, как вопрос brian-brazil:
readlink -f some_path
действительно будет разыменование каждая задействованная символическая ссылка в конструкции пути к конечная цель позади some_path
.
Но один уровень каскадных символических ссылок - это просто частный случай среди других в системе, общий случай - это N уровней каскадных символических ссылок. Посмотрите на мою систему:
$ rwhich emacs
/usr/bin/emacs
/etc/alternatives/emacs
/usr/bin/emacs24-x
rwhich
моя собственная рекурсивная реализация which
который печатает все промежуточные каскадные символические ссылки (на stderr) вплоть до конечной цели (на stdout).
Тогда, если я хочу знать, что это:
цель символической ссылки / usr / bin / emacs **, очевидный ответ для меня - /etc/alternatives/emacs
как возвращено:
readlink $(which emacs)
readlink /usr/bin/emacs
в окончательный цель за каскадными символическими ссылками / usr / bin / emacs, ответ будет /usr/bin/emacs24-x
как возвращено:
readlink -f $(which emacs)
readlink -f /usr/bin/emacs
rwhich emacs 2>/dev/null
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