it-swarm-eu.dev

Vyhledejte pouze cíl symlink

Pro použití ve skriptu Shell hledám hledaný způsob příkazového řádku pro získání cíle symbolického odkazu. Nejbližší, co jsem doposud přišel, je stat -N src, které výstupy src -> dst. Samozřejmě bych mohl analyzovat výstup a získat dst, ale zajímalo by mě, jestli existuje nějaký přímý způsob, jak získat cíl.

51
gerrit

Další možností by bylo použití speciálně navrženého příkazu readlink, pokud je k dispozici.

Např.

$ readlink -f `command -v php`
/usr/bin/php7.1
63
nikitautiu

V systému Mac OS X a FreeBSD/NetBSD/atd. své:

stat -f %Y <filename>

Obecněji si myslím, že řešení je (stat --printf =% N používá divné uvozovky):

ls -l b | sed -e 's/.* -> //'

Příklad:

# ln -s a b
# stat -f %Y b
a

Další metodou je:

# find b -maxdepth 0 -printf %l
a#

Poslední řádek je upraven, protože nemá žádný nový řádek, ale to je v pořádku, pokud potřebujete výsledek v proměnné, jako například

# f=$(find b -maxdepth 0 -printf %l)
# echo $f
a

The -maxdepth je potřeba, aby se zabránilo tomu, aby find klesal do adresářů, pokud b se stane adresářem.

18
Coroos

To lze provést pomocí GNU find: find src -Prune -printf "%l\n".

3
gerrit

Přenosná čistá trasa Bash

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}"
}
1
Léa Gris

Přenosně: žádné štěstí, kromě použití heuristiky k analýze výstupu ls -l nebo použití Perl -le 'print readlink("some-file")'

některé systémy mají příkaz readlink, jiné s -f možnost získat absolutní cestu.

Existují různé implementace příkazu stat jako obal pro systémová volání stat/lstat. Ten GNU) není v tomto ohledu užitečný, ale vestavěný zsh je více:

zmodload zsh/stat
stat +link the-link

Stále se zsh můžete získat absolutní cestu k souboru (odebere každou součást symlink) pomocí :A modifikátor (platí pro rozšíření proměnné, historii rozšíření a globbing:

~$ gstat -c %N b
`b' -> `a'
~$ var=b
~$ echo $var:A
/home/me/a
~$ echo b(:A)
/home/me/a
~$ echo ?(@:A)
/home/me/a
1

V systému, kde nemám žádné příkazy readlink nebo stat, ale mám Python 2.x, používám krátký skript:

#!/usr/bin/env python

import os, sys

if __name__ == "__main__":
    src = sys.argv[1]
    target = os.readlink(src)
    if not os.path.isabs(target):
            target = os.path.abspath(os.path.join(os.path.dirname(src), target))
    print target

Všimněte si, že na rozdíl od readlink -f toto může následovat pouze na jedné úrovni symbolu.

1
rakslice

realpath příkaz balíčku coreutils,

jak je uvedeno v manuálové stránce readlink.


například:

realpath /bin/python

výstupy

/usr/bin/python2.7

na mém stroji.

0
user86041