symlink의 목적지 만 찾으십시오


50

쉘 스크립트에서 사용하기 위해 심볼릭 링크의 대상을 얻는 명령 줄 방법을 찾고 있습니다. 가장 가까운 내가 지금까지 그래서 왔어요 stat -N src출력한다, src -> dst. 물론 출력을 구문 분석하고 얻을 수 dst는 있지만 대상을 얻는 직접적인 방법이 있는지 궁금합니다.

답변:


61

다른 옵션은 사용 readlink가능한 경우 특별히 설계된 명령을 사용하는 것입니다 .

예 :

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

21
사용 readlink -f당신이 알고 싶다면 마지막 심볼릭 링크 대상 및뿐만 아니라 다음 일을.
scai

좋은 지적! 잊어 버렸습니다.
nikitautiu

11
그 주 -fGNU에 비 휴대용 확장입니다 readlink.
바하마

2
언제 readlink를 사용할 수 없습니까? 감사.
tommy.carstensen

2
@ tommy.carstensen readlink (1)는 2003 년에 GNU coreutils에 추가되었으므로 요즘에는 coreutils를 사용하는 거의 모든 시스템에 의존 할 수 있습니다. (참조 git.savannah.gnu.org/cgit/coreutils.git/commit/src/... )
요시프 로댕

15

Mac OS X 및 FreeBSD / NetBSD / etc에서. 그:

stat -f %Y <filename>

더 일반적으로 해결책은 다음과 같습니다 (stat --printf = % N은 이상한 따옴표를 사용합니다).

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

예:

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

다른 방법은 다음과 같습니다.

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

마지막 줄은 줄 바꿈이 없기 때문에 엉망이지만 결과가 변수와 같이 필요하면 괜찮습니다.

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

-maxdepth방지하기 위해 필요한 find경우 디렉토리로 내려에서 b디렉토리로 발생합니다.


나는 완전히, 이상 미끄러 져 stat --printf='%N\n', 이상한 따옴표가 같은 따옴표 RM과 --interactive 사용 LN, 귀찮게하지 않는 내가 원하는 정확히입니다
ThorSummoner

Linux에서는 GNU coreutils의 stat (1)에 다른 매개 변수가 있고 출력에 인쇄되기 때문에 이식성이 떨어집니다 link -> dest. 이 ... GNU의 findutils의 또는 그렇지 있는지 찾기 (1) 솔루션은 확인해야합니다
요시프 로댕에게

변수 확장을 인용하는 것을 잊지 마십시오 echo $f. 심볼릭 링크가 가리키는 경우 기대할 수있는 것은 아닙니다 /*(그렇습니다 가능)
Camusensei

3

이것은 GNU를 사용하여 수행 할 수 있습니다 find: find src -prune -printf "%l\n".


1

이식 가능 : 휴리스틱을 사용하여 ls -l 출력을 구문 분석하거나 사용하는 것 외에는 운이 없습니다. perl -le 'print readlink("some-file")'

일부 시스템에는 readlink명령 이 있으며, 일부 시스템에는 -f절대 경로를 얻을 수 있는 옵션이 있습니다.

/ 시스템 호출을 stat위한 래퍼로서 다양한 명령 구현이 있습니다 . GNU는 그 점에서 유용하지 않지만 zsh의 내장 기능은 더 그렇습니다.statlstat

zmodload zsh/stat
stat +link the-link

여전히 zsh를 사용하면 :A수정 자 (변수 확장, 히스토리 확장 및 글 로빙에 적용 )를 사용하여 파일의 절대 경로를 얻을 수 있습니다 (모든 symlink 구성 요소를 제거합니다) .

~$ 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

내가 readlink없거나 stat명령이 있지만 Python 2.x 가있는 시스템에서는 짧은 스크립트를 사용하고 있습니다.

#!/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

readlink -f이와 달리 한 수준의 심볼릭 링크 만 따를 수 있습니다.


1

휴대용 순수 배쉬 영역

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}"
}

0

realpathcoreutils패키지 명령

readlink명령 매뉴얼 페이지에 링크되어 있습니다.


예를 들면 다음과 같습니다.

realpath /bin/python

출력

/usr/bin/python2.7

내 컴퓨터에.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.