명령 행을 통해 심볼릭 링크 대상 찾기 myothertextfile.txt명령 줄을 사용하는 것을 볼

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

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

그러나 이것들은 다른 플랫폼에서 테스트해야합니다. 나는 그들이 작동 할 것이라고 생각하지만 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}"
}

답변

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

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