Bir dosyanın bir dizine sembolik bir bağlantı olup olmadığını nasıl kontrol ederim?


64

Bir dosya olup olmadığını ve -L ile sembolik bir bağlantı olup olmadığını kontrol edebilirim

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

ve -d ile bir dizin ise:

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

Ancak, yalnızca dizinlere olan bağlantıları nasıl test edebilirim?


Bir test klasöründeki tüm vakaları simüle ettim:

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

Yanıtlar:


75

Sadece iki testi bir araya getirin &&:

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

1
Gizli dosyaları ve dizinleri kontrol etmek istiyorsanız, bunu daha önce önceden shopt -s dotglob
aldım

2
[-L "$ file"] && [-d "$ file"] daha iyi değil mi? Kabukları arasında taşınabilirliği olan bir şey iirc.
Lennart Rolland

3
@ Lennart OP'nin örnek kodu kullanır [[ve bunu mantıksal başlangıç ​​noktası olarak aldım. Faziletlerine bir tartışma [VS [[Bu yanıt (ama mevcut kapsamı dışındadır burada ).


1

İşlevli findve işlevli bir çözüm :

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

Bunu kullanmak findve bunun while readiçin biraz overkill ...
Camilo Martin

1
Bulmak gerçekten yararlı sadece bazı dosyalar için arama yaparsanız
rubo77
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.