ファイルがディレクトリへのシンボリックリンクであるかどうかを確認するには?

ファイルがディレクトリへのシンボリックリンクであるかどうかを確認するには?

ファイルが存在し、-L を使用してシンボリックリンクであることを確認できます。

for file in *; do
    if [[ -L "$file" ]]; then echo "$file is a symlink"; else echo "$file is not a symlink"; fi
done

-dがあるディレクトリの場合:

for file in *; do
    if [[ -d "$file" ]]; then echo "$file is a directory"; else echo "$file is a regular file"; fi
done

しかし、ディレクトリへのリンクのみをテストするにはどうすればよいですか?


テストフォルダのすべてのケースをシミュレートしました。

/tmp/test# ls
a  b  c/  d@  e@  f@

/tmp/test# file *
a: ASCII text
b: ASCII text
c: directory
d: symbolic link to `c'
e: symbolic link to `a'
f: broken symbolic link to `nofile'

ベストアンサー1

2つのテストを組み合わせてください&&

if [[ -L "$file" && -d "$file" ]]
then
    echo "$file is a symlink to a directory"
fi

または、POSIX準拠の構文の場合は、次のようにします。

if [ -L "$file" ] && [ -d "$file" ]
...

注:使用する最初の構文は[[ expr1 && expr2 ]]有効ですが、ksh(オリジナル)、bash、zshなどの特定のシェルに固有のものです。使用される2番目の構文はPOSIX規格であり、Bourne規格にも準拠しています。つまり、すべての最新および同様のシェル[ expr1 ] && [ expr2 ]で動作します。shsh

おすすめ記事