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


64

ファイルが存在し、-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'

回答:


75

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

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

1
:あなたは隠しファイルとディレクトリを確認したい場合は、あまりにもこの前preceedshopt -s dotglob
rubo77

2
[-L "$ file"] && [-d "$ file"]の方が優れていませんか?シェル間で移植性のあるものiirc。
レナート・ローランド

3
@Lennart OPのサンプルコードではを使用しており[[、それを論理的な出発点として取り上げました。[vs のメリットの説明は、[[この回答の範囲外です(ただし、こちらで確認できます)。


1

find関数を使用して使用するソリューション:

dosomething () {
    echo "doing something with $1"; 
}
find -L -path './*' -prune -type d| while read file; do 
    if [[ -L "$file" && -d "$file" ]];
        then dosomething "$file";
    fi; 
done

使用するfindwhile read、そのためには...ちょっとやり過ぎである
カミロ・マーチン

1
特定のファイルのみを検索する場合、検索は本当に便利です
rubo77 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.