Wie überprüfe ich, ob eine Datei eine symbolische Verknüpfung zu einem Verzeichnis ist?

64

Ich kann überprüfen, ob eine Datei existiert und eine symbolische Verknüpfung mit -L besteht

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

und wenn es ein Verzeichnis mit -d ist:

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

Aber wie kann ich nur auf Links zu Verzeichnissen testen?


Ich habe alle Fälle in einem Testordner simuliert:

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

Antworten:

75

Kombinieren Sie einfach die beiden Tests mit &&:

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

quelle
1
Wenn Sie auch versteckte Dateien und Verzeichnisse überprüfen möchten, gehen Sie wie folgt vor:shopt -s dotglob
rubo77
2
Ist [-L "$ file"] && [-d "$ file"] nicht besser? Etwas mit Tragbarkeit zwischen den Schalen.
Lennart Rolland
3
Der Beispielcode von @Lennart OP verwendet [[, und das habe ich als logischen Ausgangspunkt genommen. Eine Diskussion der Vorzüge von [vs [[ist für diese Antwort nicht möglich (aber hier verfügbar ).
1

Eine Lösung mit findund unter Verwendung einer Funktion:

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
quelle
Verwenden findund ein while readfür das ist ein bisschen übertrieben ...
Camilo Martin
1
Suchen ist wirklich nützlich, wenn Sie nur nach bestimmten Dateien
suchen