2011-04-23 7 views
137

bash에 심볼릭 링크가 있는지 확인하려고합니다. 여기 내가 시도한 것이있다.심볼릭 링크가 있는지 확인하는 방법

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 

그러나 작동하지 않습니다. '!' 빠져 나오면 절대로 발동하지 않습니다. 그리고 '!' 거기에, 매번 트리거합니다.

+1

그 가치는 무엇입니까? [[! -D $ mda]] 잘 작동합니다. – DMin

답변

219

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

GNU manpage에 따르면, -h-L 동일하지만 BSD manpage에 따르면,이 사용할 수 없습니다 :

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

+2

심볼릭 링크가 존재하지 않는지보고 싶습니다. ! -h 또는! -L은 심볼릭 링크에서 작동해야하며,! -e는 그렇지 않으면 작동해야합니다. – bear

+30

Google을 통해이 방법을 찾은 사용자를 돕기 위해'! '를 사용하는 전체 구문은'if! [-L $ mda]; 그런 다음 느낌표를 대괄호 안쪽에 두십시오. – Sam

+13

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

1

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

+0

심볼릭 링크가 존재하지 않는지보고 싶습니다. ! -h 또는! -L은 심볼릭 링크에서 작동해야하며,! -e는 그렇지 않으면 작동해야합니다. – bear

+3

원하는 것은 분명하지 않습니다. 파일이 존재하며 심볼릭 링크가 아닙니다. 그런 다음 * -e와! -h를 모두 테스트하십시오. –

+0

파일 비트가 오류였습니다. 파일 자체가 아닌 심볼릭 링크입니다. – bear

3

파일이 실제로 심볼 링크입니까? 그렇지 않다면, 존재에 대한 일반적인 테스트는 -r 또는 -e입니다.

man test을 참조하십시오.

13

어쩌면 이것이 당신이 찾고있는 것일 수 있습니다. 파일이 존재하고 링크가 아닌지 확인하려면.

이 명령을보십시오 : 파일이 존재하고 심볼릭 링크

심볼릭 링크되는 파일을 테스트하지 않으려면

때문이다

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

-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 
+9

'-e "$ {file}"은 (는) 심볼릭 링크가 있지만 타겟이 존재하지 않으면 실패합니다. – Flimm

+0

Flimm과 같은 결과입니다. 나는 OS X에있다. 나를 위해, -L과 -h는 symlink에 대해서는 작동하지만 -e 나 -f에는 작동하지 않는다. – pauljm

+0

@Flimm, 그래서 파일명을 가져 왔는지 테스트하고 싶다면 (파일이나 심볼릭 링크가 존재하지 않아도 상관 없다) 무엇을 할 수 있을까요? 외관상으로는 - e는 작동하지 않는다. – dragonxlwang

12

당신은 심볼릭 링크의 존재를 확인할 수 있습니다 그것은으로 파손되지 않았는지 :

[ -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 
3

어떻게 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 
관련 문제