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


208

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

ただし、それは機能しません。「!」の場合 省略されると、トリガーされません。で、もし '!' そこにあると、毎回トリガーされます。


2
[[!-D $ MDA]] ...だけで正常に動作
DMIN

回答:


328

-L「ファイル」が存在し、シンボリックリンクである場合はtrueを返します(リンクされたファイルが存在する場合と存在しない場合があります)。必要な-f場合(ファイルが存在し、通常のファイルで-eある場合はtrueを返します)または単に(ファイルがタイプに関係なく存在する場合はtrueを返します)。

よるGNUマンページ-hと同一である-Lが、それに応じてBSDのマニュアル、それが使用されるべきではありません。

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


2
シンボリックリンクが存在しないかどうかを確認しています。!-hまたは!-Lはシンボリックリンクで機能し、!-eはそれ以外で機能します。
クマ

48
私と同じようにGoogleでこれを見つけた人を助けるために、使用する完全な構文!は、角括弧の外側にif ! [ -L $mda ]; then .... fi 感嘆符を付けることです。
Sam

19
@Samによって与えられたヒントに少し何かを追加したかっただけです。これらの種類の操作を行うときは、空白の問題を防ぐために、ファイル名を引用符で囲んでください。例if [ ! -L "$mda" ]; then ... fi(注:if [ ! ... ]if ! [ ... ]同一:)
Thomas Vervest 2013

2
-Lと-hの違いは本当にわかりますか?私のbash(バージョン4.2.53(1)-release(x86_64-redhat-linux-gnu))では、bashは-Lと-hの両方で同一であり、同じように動作します。つまり、ファイルが実際にリンクであることを確認し、リンクされたファイルが存在するかどうかは気にしない
フィリップ

3
はい、-L-hされている同じman testこれも確認します。
スパーホーク2015

39

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

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

したがって、fileが単なるシンボリックリンクではなく実際に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

16
-e "${file}"シンボリックリンクは存在するがそのターゲットが存在しない場合は失敗します。
Flimm

1
Flimmと同じ結果。私はOS Xを使用しています。私にとって、-Lと-hはシンボリックリンクでは機能しますが、-eまたは-fでは機能しません。
pauljm 2014

2
@Flimm、それでファイル名が取得されたかどうかをテストしたいだけの場合(ターゲットが存在しないファイルまたはシンボリックリンクであるかどうか)、それを行うための最良の方法は何ですか?どうやら-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の両方をテストします。
Andrew Lazarus

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

ファイルは存在するがリンクではない、またはダングリングリンクである場合、最初の呼び出しは正しくありません。パスがぶら下がっているシンボリックリンクの場合、2番目は間違っています。
Jonathan Tomer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.