programing

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

bestprogram 2023. 4. 12. 23:05

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

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

하지만 그것은 효과가 없습니다.'!'를 생략하면 트리거되지 않습니다.그리고 '!'가 있으면 매번 트리거됩니다.

-L는 "file"이 존재하며 심볼릭 링크인 경우 true를 반환합니다(링크된 파일은 존재하거나 존재하지 않을 수 있습니다).너는 원한다-f(파일이 존재하며 일반 파일인 경우 true로 표시됨) 또는 단순히-e(유형에 관계없이 파일이 존재하는 경우 true가 됩니다).

GNU의 manpage에 따르면-h와 동일하다-L, BSD의 manpage에 따르면 BSD는 사용하지 마십시오.

-h filetrue는 파일이 존재하며 심볼릭 링크인 경우입니다.이 연산자는 이전 버전의 프로그램과의 호환성을 위해 유지됩니다.그 존재에 의존하지 말고 대신 -L을 사용합니다.

심볼링크가 존재하는지, 그리고 심볼링크가 다음과 같이 끊어지지 않았는지 확인할 수 있습니다.

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

-L는 심볼링크가 있는지, 끊겼는지 여부를 테스트합니다.와의 조합에 의해-e링크가 유효한지 테스트할 수 있습니다(디렉토리 또는 파일에 추가).또한 링크가 존재하는지 아닌지를 테스트할 수 있습니다.

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

어쩌면 이게 네가 찾고 있는 것일 수도 있어.파일이 존재하며 링크가 아닌지 확인합니다.

다음 명령을 사용해 보십시오.

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

를 사용하는 것은 어떻습니까?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

그 파일이 정말 심볼릭 링크인가요?그렇지 않은 경우, 일반적인 존재 여부는-r또는-e.

man test.

  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

파일 존재 여부를 테스트하는 경우 -e가 아닌 -L로 심볼 링크를 테스트합니다.

언급URL : https://stackoverflow.com/questions/5767062/how-to-check-if-a-symlink-exists