파일이 다른 링크에 대한 링크인지 테스트하고 싶습니다. readlink를 시도했지만 필요한 방식으로 작동하지 않습니다.
[email protected],1:~/subdir1 $ ll
lrwxrwxrwx 1 pi pi 13 Apr 10 14:34 hellolink -> subdir2/hello
lrwxrwxrwx 1 pi pi 9 Apr 10 14:34 hellolink2 -> hellolink
drwxr-xr-x 2 pi pi 4096 Apr 10 14:33 subdir2
readlink를 사용하면 이제 최종 대상의 정규화된 형식이나 다음 링크(hellolink)의 기본 파일 이름을 얻을 수 있습니다.
[email protected],1:~/subdir1 $ readlink -f hellolink2
/home/ralph/subdir1/subdir2/hello
[email protected],1:~/subdir1 $ readlink hellolink2
hellolink
하지만 나에게 필요한 것은 hellolink2가 가리키는 파일의 전체 경로입니다.
/home/ralph/subdir1/hellolink
지금 나는 다음과 같은 일을 하고 있습니다.
if [ -h "$(dirname hellolink2)/$(readlink hellolink2)" ] ; then
echo hellolink2 is a link
fi
루프에서 이 작업을 여러 번 수행하고 find를 사용하여 파일 이름을 제공하면 오버헤드가 많이 발생하는 것 같습니다.
더 쉬운 방법이 있나요?
답변1
파일이 심볼릭 링크인지 확인하려면 test -L(readlink 없이)을 사용하세요.
if [ -L hellolink2 ]
디렉토리 심볼릭 링크의 절대 경로를 얻으려면 realpath를 사용하십시오.
$ realpath hellolink2
/home/ralph/subdir1/hellolink
답변2
그만한 가치가 있는지... 위 주석의 제안에 따라 링크가 가리키는 파일을 얻을 수 있도록 코드를 다시 작성했습니다. 비록 다른 링크이더라도 테스트할 몇 줄을 더한 것입니다.
#!/bin/bash
function nextlinked ()
{
if [ -h "$1" ]; then # we have a link
linked="$(readlink "$1")"
[ "${linked:0:1}" == / ] && echo "$linked" || echo "${1%/*}"/"$linked"
fi
}
header=""
add=" "
count=0
find / -print0 | while read -rd '' FILENAME ; do
(( count++ ))
if [ -h "$FILENAME" ] ; then # is this a link?
filename="$FILENAME"
printf "%6d " $count ; ls -ld "$filename" 2>&1
filename="$(nextlinked "$filename" )"
while [ "$filename" ] ; do
header=$header$add
printf "%6d %s" $count "$header" ; ls -ld "$filename" 2>&1
filename="$(nextlinked "$filename")"
done
header=""
fi
done
질문은 여전히 남아 있습니다. nextlinked 함수의 작업을 수행할 수 있는 기존 Linux 명령이 있습니까?