web-dev-qa-db-ja.com

シンボリックリンクが存在するかどうかを確認する方法

シンボリックリンクが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

しかし、それはうまくいきません。 '!'の場合が除外されている、それはトリガすることはありません。で、もし '!'ある、それは毎回トリガーします。

183
bear

"file"が存在し、シンボリックリンクである場合、-Lはtrueを返します(リンクされたファイルは存在してもしなくてもかまいません)。 -f(fileが存在し、通常のファイルである場合はtrueを返す)か、単に-e(typeに関係なくfileが存在する場合はtrueを返す)が必要です。

GNUのマンページ によると、-h-Lと同一ですが、 BSDのマンページ によると、使用しないでください。

-h file fileが存在し、かつシンボリックリンクであれば真となります。この演算子は、このプログラムの以前のバージョンとの互換性のために残されています。その存在に頼らないでください。代わりに-Lを使用してください。

283
drysdam

-Lはファイルが存在するかどうかのテストであり、またシンボリックリンクです。

ファイルがシンボリックリンクであることをテストしたくないが、タイプ(ファイル、ディレクトリ、ソケットなど)に関係なく存在するかどうかを単にテストする場合は-eを使用します。

したがって、fileが実際にはファイルであり、単なるシンボリックリンクではない場合は、これらすべてのテストを実行して、値がエラー状態を示す終了ステータスを取得できます。

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
37
Corin

シンボリックリンクの存在とそれが壊れていないことをチェックすることができます。

[ -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
31
Chen Levy

たぶんこれはあなたが探しているものです。ファイルが存在し、リンクではないかどうかを確認します。

このコマンドを試してください。

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

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
6
popedotninja

ファイルは本当にシンボリックリンクですか?そうでなければ、存在の通常のテストは-rまたは-eです。

man testを参照してください。

4
DigitalRoss
  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
2
Amin Shateri

ファイルの存在をテストしているなら、-Lではなく-eが必要です。 -Lシンボリックリンクをテストします。

2
Andrew Lazarus