심볼릭 링크를 설정했다고 가정 해보십시오.
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
, 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