심볼릭 링크가 있는지 확인하는 방법


208

bash에 symlink가 있는지 확인하려고합니다. 여기 내가 시도한 것이 있습니다.

mda=/usr/mda
if [ ! -L $mda ]; then
  echo "=> File doesn't exist"
fi


mda='/usr/mda'
if [ ! -L $mda ]; then
  echo "=> File doesn't exist"
fi

그러나 그것은 작동하지 않습니다. 만약 '!' 빠지지 않으면 트리거되지 않습니다. 그리고 만약 '!' 거기에, 그것은 매번 트리거합니다.


2
[[! -D $ mda]] 잘 작동합니다.
DMin

답변:


327

-L"파일"이 존재하고 심볼릭 링크 인 경우 true를 리턴합니다 (링크 된 파일이 존재하거나 존재하지 않을 수 있음). 원하는 -f경우 (파일이 존재하고 일반 파일 인 -e경우 true를 반환 ) 또는 어쩌면 (유형에 관계없이 파일이 존재하는 경우 true를 반환)

받는 따르면 GNU 맨 , -h동일 -L하지만 따른 BSD 맨 이를 사용해서는 안된다 :

-h file 파일이 존재하고 기호 링크 인 경우에 해당됩니다. 이 연산자는이 프로그램의 이전 버전과의 호환성을 위해 유지됩니다. 그 존재에 의존하지 마십시오. 대신 -L을 사용하십시오.


2
심볼릭 링크가 존재하지 않는지 확인하려고합니다. ! -h 또는! -L은 심볼릭 링크에 대해 작동해야하며! -e는 그렇지 않으면 작동해야합니다.
베어

48
내가 한 구글을 통해이 발견 도움말 사람에게 사용하는 전체 구문 !입니다 if ! [ -L $mda ]; then .... fi 즉 느낌표를 넣어 외부 대괄호.
Sam

19
@Sam이 제공하는 팁에 약간의 것을 추가하고 싶었습니다. 이러한 종류의 작업을 수행 할 때는 공백 문제를 방지하기 위해 파일 이름을 따옴표로 묶어야합니다. 예를 들면 if [ ! -L "$mda" ]; then ... fi(참고 : if [ ! ... ]if ! [ ... ]:) 동일하다
토마스 Vervest

2
-L과 -h의 차이점이 실제로 있습니까? 내 bash (버전 4.2.53 (1)-릴리스 (x86_64-redhat-linux-gnu)에서 man bash는 -L과 -h 모두 동일하며 동일하게 작동합니다. 즉, 파일이 실제로 링크인지 확인하고 링크 된 파일의 존재 여부는 상관 없습니다
philippe lhardy

3
예, -L그리고 -h입니다 같은 . man test또한 이것을 확인합니다.
Sparhawk

39

-L이 존재하고있다 파일에 대한 테스트입니다 또한 심볼릭 링크

기호 링크 인 파일을 테스트하지 않고 유형 (파일, 디렉토리, 소켓 등)에 관계없이 파일이 존재하는지 테스트하려면 -e를 사용하십시오.

따라서 파일이 심볼 링크가 아니라 실제로 파일 인 경우 이러한 모든 테스트를 수행하고 값이 오류 조건을 나타내는 종료 상태를 얻을 수 있습니다.

if [ ! \( -e "${file}" \) ]
then
     echo "%ERROR: file ${file} does not exist!" >&2
     exit 1
elif [ ! \( -f "${file}" \) ]
then
     echo "%ERROR: ${file} is not a file!" >&2
     exit 2
elif [ ! \( -r "${file}" \) ]
then
     echo "%ERROR: file ${file} is not readable!" >&2
     exit 3
elif [ ! \( -s "${file}" \) ]
then
     echo "%ERROR: file ${file} is empty!" >&2
     exit 4
fi

16
-e "${file}"심볼릭 링크가 있지만 해당 대상이 없으면 실패합니다.
Flimm

1
Flimm과 동일한 결과입니다. OS X를 사용하고 있습니다. 저에게 -L과 -h는 심볼릭 링크에서 작동하지만 -e 또는 -f에서는 작동하지 않습니다.
pauljm

2
@Flimm, 파일 이름이 파일인지 또는 대상이없는 symlink인지 여부를 테스트하려는 경우 가장 좋은 방법은 무엇입니까? 분명히 -e가 작동하지 않습니다
dragonxlwang

38

심볼릭 링크가 있는지 확인하고 심볼릭 링크가 손상되지 않았는지 확인할 수 있습니다.

[ -L ${my_link} ] && [ -e ${my_link} ]

따라서 완벽한 솔루션은 다음과 같습니다.

if [ -L ${my_link} ] ; then
   if [ -e ${my_link} ] ; then
      echo "Good link"
   else
      echo "Broken link"
   fi
elif [ -e ${my_link} ] ; then
   echo "Not a link"
else
   echo "Missing"
fi

2
-L 심볼릭 링크가 있는지 테스트합니다. -e와 결합하여 링크가 유효한지 테스트 할 수 있습니다 (디렉토리 또는 파일에 링크). 이 측면을 포착하는 것이 중요하다는 것을 알았 으므로이 솔루션을 투표하십시오.
Torbjörn Österdahl

14

아마도 이것이 당신이 찾고있는 것입니다. 파일이 존재하고 링크가 아닌지 확인합니다.

이 명령을 시도하십시오 :

file="/usr/mda" 
[ -f $file ] && [ ! -L $file ] && echo "$file exists and is not a symlink"

8

어때요 readlink?

# if symlink, readlink returns not empty string (the symlink target)
# if string is not empty, test exits w/ 0 (normal)
#
# if non symlink, readlink returns empty string
# if string is empty, test exits w/ 1 (error)
simlink? () {
  test "$(readlink "${1}")";
}

FILE=/usr/mda

if simlink? "${FILE}"; then
  echo $FILE is a symlink
else
  echo $FILE is not a symlink
fi

4

파일이 실제로 심볼릭 링크입니까? 그렇지 않은 경우 일반적인 존재 테스트는 -r또는 -e입니다.

참조하십시오 man test.


3

파일 존재를 테스트하는 경우 -L이 아닌 -e를 원합니다. -L은 심볼릭 링크를 테스트합니다.


심볼릭 링크가 존재하지 않는지 확인하려고합니다. ! -h 또는! -L은 심볼릭 링크에 대해 작동해야하며! -e는 그렇지 않으면 작동해야합니다.
베어

3
당신이 원하는 것은 명확하지 않습니다. 파일이 존재하며 심볼릭 링크가 아닙니까? 그런 다음 -e와! -h를 모두 테스트 하십시오.
앤드류 나사로

3
  1. 먼저이 스타일로 할 수 있습니다 :

    mda="/usr/mda"
    if [ ! -L "${mda}" ]; then
      echo "=> File doesn't exist"
    fi
  2. 더 고급 스타일로하고 싶다면 다음과 같이 쓸 수 있습니다.

    #!/bin/bash
    mda="$1"
    if [ -e "$1" ]; then
        if [ ! -L "$1" ]
        then
            echo "you entry is not symlink"
        else
            echo "your entry is symlink"
        fi
    else
      echo "=> File doesn't exist"
    fi

위의 결과는 다음과 같습니다

root@linux:~# ./sym.sh /etc/passwd
you entry is not symlink
root@linux:~# ./sym.sh /usr/mda 
your entry is symlink
root@linux:~# ./sym.sh 
=> File doesn't exist

파일이 존재하지만 링크가 아니거나 매달려있는 링크 인 경우 첫 번째 호출이 잘못되었습니다. 경로가 매달려있는 심볼릭 링크 인 경우 두 번째는 잘못되었습니다.
Jonathan Tomer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.