Jak znaleźć wszystkie miękkie linki (dowiązania symboliczne) w bieżącym katalogu?

10

Pytanie dotyczy skryptowania powłoki w bash.

Jak sprawdzić za pomocą skryptu, które pliki w bieżącym katalogu są miękkimi linkami?

W przypadku, gdy użyłem niewłaściwego terminu, kiedy mówię miękkie linki , mam na myśli pliki utworzone za pomocą ln -s.

Jedyną rzeczą, o której udało mi się myśleć, jest ocena ls -lajako wyrażenie i analiza jego wyników, ale oczywiście nie jest to najlepsze rozwiązanie.

bguiz
źródło
1
Są one określane jako „dowiązania symboliczne” (w przeciwieństwie do „dowiązań twardych”).
Wstrzymano do odwołania.
Po prostu wiedziałem, że prawdopodobnie źle zrozumiałem ten termin, dzięki za heads-up
bguiz,
Miękki link też jest w porządku, ale ma spację. :-) ( en.wikipedia.org/wiki/Symbolic_link )
Arjan

Odpowiedzi:

14

Zobacz „WYRAŻENIA WARUNKOWE” w man bash- w tym przypadku chcesz -h:

for file in *
do
  if [ -h "$file" ]; then
    echo "$file"
  fi
done
Polsy
źródło
2
faqs.org/docs/bashman/bashref_68.html - W przypadku wyrażeń warunkowych lepiej jest czytać niż stronę podręcznika.
Manos Dilaverakis
Dzięki @Polsy i @Manos! test -hjest tym, czego chciałem!
bguiz,
14

Może naprawdę nie potrzebujesz skryptu. Aby wyświetlić dowolne dowiązania symboliczne tylko w bieżącym folderze, bez ponownego przechodzenia do dowolnego folderu podrzędnego:

odnaleźć . -maxdepth 1 -typ l -print

Lub, aby uzyskać więcej informacji, użyj jednego z:

odnaleźć . -maxdepth 1 -type l -exec ls -ld {} +
odnaleźć . -maxdepth 1 -type l -print0 | xargs -0 ls -ld

Aby stwierdzić, czy plik jest dowiązaniem symbolicznym, można użyć tego readlink, który nic nie wyświetli, jeśli nie jest dowiązaniem symbolicznym. Poniższy przykład nie jest całkiem użyteczny, ale pokazuje, jak readlinkignoruje normalne pliki i foldery. Użyj jednego z:

odnaleźć . -maxdepth 1 -exec readlink {} +
odnaleźć . -maxdepth 1 -print0 | xargs -0 readlink

Zauważ, że powyższe -exec ... +i xargs ...są znacznie szybsze niż -exec ... \;. Lubić:

czas znajdź / usr / bin -maxdepth 1 -type l -exec ls -ld {} \;
prawdziwe 0m0,372s
użytkownik 0m0,087s
sys 0m0,163

czas znajdź / usr / bin -maxdepth 1 -type l -exec ls -ld {} +
prawdziwe 0m0,013s
użytkownik 0m0,004s
sys 0m0,008s

czas znajdź / usr / bin -maxdepth 1 -type l -print0 | xargs -0 ls -ld
prawdziwe 0m0.012s
użytkownik 0m0,004s
sys 0m0,009s
Arjan
źródło
Bardziej podobała mi się odpowiedź Polsy, wciąż dla ciebie +1, ponieważ może kiedyś będę musiał zrobić to poza skryptem powłoki.
bguiz,
1
Nie musisz koniecznie xargs. Możesz po prostu użyć find. -maxdepth 1 -exec readlink {} \;
stib
To prawda, @stib, ale na komputerze Mac xargsjest znacznie szybszy; zobacz moją edycję. Ale dowiedziałem się czegoś nowego dzisiaj: tam też +zamiast \;(choć niektórzy twierdzą, że to nie ma / miała problemy z grep.)
Arjan