명령 행을 통해 심볼릭 링크 대상 찾기


129

심볼릭 링크를 설정했다고 가정 해보십시오.

ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt

대상이 myothertextfile.txt명령 줄을 사용하는 것을 볼 수있는 방법이 있습니까?

답변:


170

-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

8
다른 질문 에서 제안한대로 사용할 수 있습니다 readlink -f.
Denilson Sá Maia 2016 년

5
Mac OS X에서이 기능을 사용하려면 brew install coreutils. 이 문자로 시작 명령의 기본 GNU 버전의 설치 g, 즉greadlink -f somefile
마이크 D

-f 스위치를 사용하면 명령에서 아무것도 반환하지 않습니다.
sotn

-f를 사용하면 여러 심볼릭 링크를 해결하고 최종 대상을 표시하는 등 원하는 정보를 얻을 수있었습니다.
isapir

Ubuntu 18.04.1 LTS (Bionic Beaver)readlink를의 맨 말하는 메모가 "참고 realpath (1) 정규화 기능에 사용하는 기본 명령입니다."
Sam Kamensky

23

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

첫 번째 대답에는 아무런 문제가 없지만이 답변은 더 완전하고 도움이됩니다.
Mike S

6

이것은 또한 작동합니다 :

ls -l /root/Public/myothertextfile.txt

그러나 readlink구문 분석보다는 스크립트에서 사용하는 것이 좋습니다 ls.


4

링크의 소스와 대상을 표시하려면을 시도하십시오 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"심볼 링크의 경우 역 참조와 파일 이름을 인용"를 의미한다.


2

readlink좋은 일이지만, GNU 별 및 비 크로스 플랫폼입니다. 에 대한 크로스 플랫폼 스크립트를 작성 /bin/sh했으므로 다음과 같은 것을 사용합니다.

 ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'

또는:

 ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'

그러나 이것들은 다른 플랫폼에서 테스트해야합니다. 나는 그들이 작동 할 것이라고 생각하지만 ls출력 형식을 100 % 확신하지 못합니다 .

결과 ls캔은 또한 내 분석 될 bash외부 명령 등에 의존하지 않고 awk, sedperl.

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

1

을 사용할 수 없으면 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

1

이 질문은 brian-brazil의 질문처럼 간단한 답변을 줄만큼 정확하지 않습니다.

readlink -f some_path

실제로 경로 구성에 관련된 모든 심볼릭 링크최종 대상 뒤에 역 참조 합니다some_path .

그러나 한 단계의 계단식 심볼릭 링크는 시스템에서 다른 것들 중에서 특히 특별한 경우이며, 일반적인 경우는 N 레벨의 계단식 심볼릭 링크입니다. 내 시스템에서 다음을보십시오.

$ rwhich emacs
/usr/bin/emacs
 /etc/alternatives/emacs
  /usr/bin/emacs24-x

rwhichwhich모든 중간 계단식 심볼릭 링크 (stderr로)를 최종 대상 (stdout으로)으로 인쇄하는 내 자체 재귀 구현입니다 .

그렇다면 내가 무엇인지 알고 싶다면 :

  • symlink / usr / bin / emacs ** 의 목표 는 다음 /etc/alternatives/emacs과 같이 반환됩니다.

    readlink $(which emacs)
    readlink /usr/bin/emacs
    
  • 계단식 symlinks / usr / bin / emacs 뒤에 있는 최종 목표 는 다음 /usr/bin/emacs24-x과 같이 반환됩니다.

    readlink -f $(which emacs)
    readlink -f /usr/bin/emacs
    rwhich emacs 2>/dev/null
    

0

ll또는 ls -l기호 링크 및 대상을 포함하여 디렉토리 항목을 나열해야합니다.

cd -P /root/Public/myothertextfile.txt (귀하의 경우) 원래 경로를 가리켜 야합니다


0

폴더와 하위 폴더 내의 모든 링크 대상을 찾으면 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.