Jak sprawdzić, czy plik jest dowiązaniem symbolicznym do katalogu?

64

Mogę sprawdzić, czy plik istnieje i jest dowiązaniem symbolicznym z -L

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

a jeśli jest to katalog z opcją -d:

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

Ale jak mogę przetestować tylko linki do katalogów?


Symulowałem wszystkie przypadki w folderze testowym:

/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
źródło

Odpowiedzi:

75

Wystarczy połączyć dwa testy z &&:

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

źródło
1
Jeśli chcesz sprawdzić ukryte pliki i katalogi, wcześniej to shopt -s dotglob
wykonaj
2
Czy [-L „$ plik”] i& [-d „$ plik”] nie jest lepszy? Coś z przenośnością między pociskami iirc.
Lennart Rolland
3
Przykładowy kod @Lennart OP używa [[, i wziąłem to jako logicznego punktu wyjścia. Omówienie zalet [vs nie [[mieści się w tej odpowiedzi (ale dostępne tutaj ).
1

Rozwiązanie z findfunkcją i za pomocą:

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
źródło
Używanie findi while readdo tego jest trochę przesadzone ...
Camilo Martin
1
Znajdź jest bardzo przydatny, jeśli szukasz tylko niektórych plików
rubo77