답변:
-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
brew install coreutils
. 이 문자로 시작 명령의 기본 GNU 버전의 설치 g
, 즉greadlink -f somefile
Ubuntu 18.04.1 LTS (Bionic Beaver)
readlink를의 맨 말하는 메모가 "참고 realpath (1) 정규화 기능에 사용하는 기본 명령입니다."
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
은 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
, 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}"
}
을 사용할 수 없으면 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
rwhich
는 which
모든 중간 계단식 심볼릭 링크 (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
폴더와 하위 폴더 내의 모든 링크 대상을 찾으면 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
readlink -f
.