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'
shopt -s dotglob
[[
, 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 ).Hier ist ein einzelner Befehl, der rekursiv Symlinks auflistet, deren Ziel ein Verzeichnis ist (beginnend im aktuellen Verzeichnis):
find . -type l -xtype d
Referenz: http://www.commandlinefu.com/commands/view/6105/find-all-symlinks-that-link-to-directories
quelle
Eine Lösung mit
find
und unter Verwendung einer Funktion:quelle
find
und einwhile read
für das ist ein bisschen übertrieben ...