연결된 링크를 테스트하는 방법은 무엇입니까?

연결된 링크를 테스트하는 방법은 무엇입니까?

파일이 다른 링크에 대한 링크인지 테스트하고 싶습니다. 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 명령이 있습니까?

관련 정보