Bagaimana cara saya memeriksa apakah suatu file merupakan tautan simbolis ke direktori?

64

Saya dapat memeriksa, apakah ada file dan merupakan tautan simbolik dengan -L

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

dan jika itu adalah direktori dengan -d:

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

Tetapi bagaimana saya bisa menguji hanya tautan ke direktori?


Saya mensimulasikan semua kasus dalam folder tes:

/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'
rubo77
sumber

Jawaban:

75

Gabungkan kedua tes dengan &&:

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

sumber
1
Jika Anda ingin memeriksa file dan direktori yang tersembunyi sebelumnya sebelumnya:shopt -s dotglob
rubo77
2
Bukankah [-L "$ file"] && [-d "$ file"] lebih baik? Sesuatu dengan portabilitas antara cangkang iirc.
Lennart Rolland
3
@Lennart menggunakan kode contoh OP [[, dan saya menganggap itu sebagai titik awal yang logis. Diskusi tentang manfaat [vs tidak [[termasuk dalam cakupan untuk jawaban ini (tetapi tersedia di sini ).
1

Solusi dengan finddan menggunakan fungsi:

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
rubo77
sumber
Menggunakan finddan while readuntuk itu agak berlebihan ...
Camilo Martin
1
Temukan sangat berguna jika Anda hanya mencari file-file tertentu
rubo77