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'

Jawaban:


75

Gabungkan kedua tes dengan &&:

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

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

Menggunakan finddan while readuntuk itu agak berlebihan ...
Camilo Martin

1
Temukan sangat berguna jika Anda hanya mencari file-file tertentu
rubo77
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.