Узнайте цель символьной ссылки через командную строку

От бедра я предположил бы, что кластерный IP настроен таким образом, что маршрут и сетевая маска устраняют его работающий через маршрутизатор.

132
задан 19 October 2009 в 21:36
9 ответов

Используйте -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
173
ответ дан 28 November 2019 в 19:18

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
23
ответ дан 28 November 2019 в 19:18

Это будет также работать:

ls -l /root/Public/myothertextfile.txt

но readlink был бы предпочтен для использования в сценарии вместо парсинга ls.

6
ответ дан 28 November 2019 в 19:18

Если вы не можете использовать 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
1
ответ дан 28 November 2019 в 19:18

Если вы хотите показать источник и назначение ссылки, попробуйте 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 означает «имя файла в кавычках с разыменованием при символической ссылке».

4
ответ дан 28 November 2019 в 19:18

Ссылка для чтения - хорошая вещь, но она специфична для 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}"
}
2
ответ дан 28 November 2019 в 19:18

ll или ls -l должен перечислить элементы каталога, включая вашу символическую ссылку и ее цель

cd -P /root/Public/myothertextfile.txt (в вашем случае) должен указывать на исходный путь

0
ответ дан 28 November 2019 в 19:18

Если вы найдете цель всех ссылок в папке и ее подпапке, используйте команду 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
0
ответ дан 28 November 2019 в 19:18

Вопрос недостаточно точен, чтобы дать простой ответ, такой как у 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
     
1
ответ дан 28 November 2019 в 19:18

Теги

Похожие вопросы