예를 하나 들어보겠습니다(이것은 단지여기):
$ ls -l /usr/bin/gnome-text-editor
lrwxrwxrwx 1 root root 35 Mar 16 2015 /usr/bin/gnome-text-editor -> /etc/alternatives/gnome-text-editor
$ ls -l /etc/alternatives/gnome-text-editor
lrwxrwxrwx 1 root root 14 Mar 16 2015 /etc/alternatives/gnome-text-editor -> /usr/bin/gedit
$ ls -l /usr/bin/gedit
-rwxr-xr-x 1 root root 588064 Mar 27 2014 /usr/bin/gedit
ls -l
여기서 목적지에 도달하기 위해 세 번이나 사용해야 했다는 것을 알 수 있습니다 . (세 번째는 링크/usr/bin/gedit
가 아닌지 확인하는 것입니다 `)
다음과 같은 예상 출력을 얻을 수 있는 방법이 있습니까(스크립트나 기타 명령 등을 작성하여)?
$ <improved ls -l> /usr/bin/gnome-text-editor
lrwxrwxrwx 1 root root 35 Mar 16 2015 /usr/bin/gnome-text-editor -> /etc/alternatives/gnome-text-editor
lrwxrwxrwx 1 root root 14 Mar 16 2015 /etc/alternatives/gnome-text-editor -> /usr/bin/gedit
또 다른 좋은 결과는 다음과 같습니다.
$ <some-command> /usr/bin/gnome-text-editor
/usr/bin/gnome-text-editor > /etc/alternatives/gnome-text-editor > /usr/bin/gedit
답변1
이 경우 이는 Debian의 "대체"이므로 더 자세한 내용을 보려면 다음을 사용할 수 있습니다.
$ update-alternatives --display gnome-text-editor
gnome-text-editor - auto mode
link best version is /usr/bin/gedit
link currently points to /usr/bin/gedit
link gnome-text-editor is /usr/bin/gnome-text-editor
slave gnome-text-editor.1.gz is /usr/share/man/man1/gnome-text-editor.1.gz
/usr/bin/gedit - priority 50
slave gnome-text-editor.1.gz: /usr/share/man/man1/gedit.1.gz
/usr/bin/leafpad - priority 40
slave gnome-text-editor.1.gz: /usr/share/man/man1/leafpad.1.gz
보다 일반적으로 Linux에서는 다음 namei
명령을 사용하여 경로 확인과 관련된 모든 기호 링크에 대해 알아볼 수 있습니다(마운트 지점도 사용할 수 있음 -x
).
$ namei -lx /usr/bin/gnome-text-editor
f: /usr/bin/gnome-text-editor
Drwxr-xr-x root root /
drwxr-xr-x root root usr
drwxr-xr-x root root bin
lrwxrwxrwx root root gnome-text-editor -> /etc/alternatives/gnome-text-editor
Drwxr-xr-x root root /
drwxr-xr-x root root etc
drwxr-xr-x root root alternatives
lrwxrwxrwx root root gnome-text-editor -> /usr/bin/gedit
Drwxr-xr-x root root /
drwxr-xr-x root root usr
drwxr-xr-x root root bin
-rwxr-xr-x root root gedit
귀하의 질문에 더 직접적으로 대답하기 위해 다음과 같이 하겠습니다.
#! /bin/zsh -
zmodload zsh/stat || exit
ret=0
for file do
n=0
while
ls -ld -- "$file" || ! ret=1 && [ -L "$file" ]
do
if ((++n > 40)) && [ ! -e "$file" ]; then
echo >&2 too many symlinks
ret=1
break
fi
zstat -A target +link -- "$file" || ! ret=1 || break
case $target in
(/*) file=$target;;
(*) file=$file:h/$target
esac
done
done
exit "$ret"
이는 무슨 일이 일어나고 있는지 이해하는 데 필요한 모든 정보를 제공하지 못할 수도 있습니다. 예를 들면 다음과 같습니다.
$ ./resolve-symlink b/b/b/b/x/b
lrwxrwxrwx 1 stephane stephane 1 Mar 18 15:37 b/b/b/b/x/b -> a
lrwxrwxrwx 1 stephane stephane 4 Mar 18 15:37 b/b/b/b/x/a -> ../a
lrwxrwxrwx 1 stephane stephane 26 Mar 18 15:15 b/b/b/b/x/../a -> /usr/bin/gnome-text-editor
lrwxrwxrwx 1 root root 35 Nov 5 2013 /usr/bin/gnome-text-editor -> /etc/alternatives/gnome-text-editor
lrwxrwxrwx 1 root root 14 Mar 15 12:21 /etc/alternatives/gnome-text-editor -> /usr/bin/gedit
-rwxr-xr-x 1 root root 10344 Nov 12 17:18 /usr/bin/gedit
그리고:
$ namei -lx b/b/b/b/x/b
f: b/b/b/b/x/b
lrwxrwxrwx stephane stephane b -> .
drwxr-xr-x stephane stephane .
lrwxrwxrwx stephane stephane b -> .
drwxr-xr-x stephane stephane .
lrwxrwxrwx stephane stephane b -> .
drwxr-xr-x stephane stephane .
lrwxrwxrwx stephane stephane b -> .
drwxr-xr-x stephane stephane .
lrwxrwxrwx stephane stephane x -> 2
drwxr-xr-x stephane stephane 2
lrwxrwxrwx stephane stephane b -> a
lrwxrwxrwx stephane stephane a -> ../a
drwxr-xr-x stephane stephane ..
lrwxrwxrwx stephane stephane a -> /usr/bin/gnome-text-editor
Drwxr-xr-x root root /
drwxr-xr-x root root usr
drwxr-xr-x root root bin
lrwxrwxrwx root root gnome-text-editor -> /etc/alternatives/gnome-text-editor
Drwxr-xr-x root root /
drwxr-xr-x root root etc
drwxr-xr-x root root alternatives
lrwxrwxrwx root root gnome-text-editor -> /usr/bin/gedit
Drwxr-xr-x root root /
drwxr-xr-x root root usr
drwxr-xr-x root root bin
-rwxr-xr-x root root gedit
답변2
readlink
당신이 찾고있는 명령입니다.
$ readlink -e /usr/bin/gnome-text-editor
/usr/bin/gedit
링크가 끊어졌을 때 링크가 어떻게 작동할지에 따라 다양한 플래그( -f
, , )를 사용할 수 있습니다 -e
. 참고자료를 참조하세요.-m
man readlink
답변3
다음 스크립트를 사용할 수 있습니다.
$ cat myll
#!/bin/bash
name="$1"
while [[ -L "$name" ]]; do
ls -l "$name";
name=`readlink "$name"`;
done
출력 예:
$ myll /usr/bin/gnome-text-editor
lrwxrwxrwx 1 root root 35 Mar 16 2015 /usr/bin/gnome-text-editor -> /etc/alternatives/gnome-text-editor
lrwxrwxrwx 1 root root 14 Mar 16 2015 /etc/alternatives/gnome-text-editor -> /usr/bin/gedit
[[ -L "$name" ]]
파일이 링크인지 확인하고 링크 readlink "$name"
를 읽고 name
다음 루프를 위한 변수에 저장합니다. 따라서 while [[ -L "$name" ]]
원래 대상/파일에 도달할 때까지 반복하십시오.
두 번째 해결 방법으로 다음을 사용할 수 있습니다.
#!/bin/bash
name="$1"
while [[ -L "$name" ]]; do
echo -n "$name > ";
name=`readlink "$name"`;
done
echo "$name"
출력 예:
$ myls /usr/bin/gnome-text-editor
/usr/bin/gnome-text-editor > /etc/alternatives/gnome-text-editor > /usr/bin/gedit