How to check if a symlink exists

前端 未结 8 2044
無奈伤痛
無奈伤痛 2020-12-04 05:04

I\'m trying to check if a symlink exists in bash. Here\'s what I\'ve tried.

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


mda         


        
相关标签:
8条回答
  • 2020-12-04 05:43

    -L returns true if the "file" exists and is a symbolic link (the linked file may or may not exist). You want -f (returns true if file exists and is a regular file) or maybe just -e (returns true if file exists regardless of type).

    According to the GNU manpage, -h is identical to -L, but according to the BSD manpage, it should not be used:

    -h file True if file exists and is a symbolic link. This operator is retained for compatibility with previous versions of this program. Do not rely on its existence; use -L instead.

    0 讨论(0)
  • 2020-12-04 05:43

    You can check the existence of a symlink and that it is not broken with:

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

    So, the complete solution is:

    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
    
    0 讨论(0)
  • 2020-12-04 05:45

    -L is the test for file exists and is also a symbolic link

    If you do not want to test for the file being a symbolic link, but just test to see if it exists regardless of type (file, directory, socket etc) then use -e

    So if file is really file and not just a symbolic link you can do all these tests and get an exit status whose value indicates the error condition.

    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
    
    0 讨论(0)
  • 2020-12-04 05:48

    Maybe this is what you are looking for. To check if a file exist and is not a link.

    Try this command:

    file="/usr/mda" 
    [ -f $file ] && [ ! -L $file ] && echo "$file exists and is not a symlink"
    
    0 讨论(0)
  • 2020-12-04 05:57

    How about using 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
    
    0 讨论(0)
  • 2020-12-04 06:00

    If you are testing for file existence you want -e not -L. -L tests for a symlink.

    0 讨论(0)
提交回复
热议问题