lista plików według celu dowiązania symbolicznego

23

Jak uzyskać listę plików (a następnie zrobić coś z tą listą), filtrując według nazwy docelowej dowiązania symbolicznego , a nie nazwy dowiązania symbolicznego? Na przykład z poniższej listy interesują mnie tylko pierwsze cztery pliki (zawiera cel bar):

foo ->  /tmp/bar
bar ->  /home/me/bartoo
baz ->  /home/me/public/barthree
zoo ->  /usr/share/bar
moo ->  /tmp/foo
roc ->  /tmp/roc
matowe wilkie
źródło

Odpowiedzi:

31

Możesz użyć find, aby pobrać wszystkie pliki typu dowiązanie symboliczne i dodać -ilnameopcję wyszukiwania według nazwy miejsca docelowego łącza. Działa to tak samo, jak -inamew przypadku nazwy docelowej łącza zamiast nazwy łącza.

find -type l -ilname "*bar*"

To nadal wypisze nazwę linku, a nie celu. Jeśli chcesz wydrukować nazwy celów, spróbuj tego:

find -type l -ilname "*bar*" -printf "%l\n"

Lub uzyskaj pełny efekt lswyjściowy

find -type l -ilname "*bar*" -ls

To, co rozumiesz przez „ zrób coś z listą ”, jest niejasne, ale jeśli chcesz operować na plikach łączy, możesz użyć -execargumentu, aby znaleźć:

find -type l -ilname "*bar*" -exec touch {} \;

Ale jeśli musisz operować na elementach docelowych łącza, będziesz musiał użyć przycisku, -printfaby uzyskać wartości docelowe, a następnie xargswykonać pętlę samodzielnie. Możesz zrobić coś takiego:

find -type l -printf "%l\n" | grep bar | xargs touch

... który pokazuje również, jak używać grepzamiast find -ilnamedopasowywania imienia, chociaż możesz to zrobić w obie strony.

Caleb
źródło
dziękuję Caleb! W pełni odpowiedziałeś na moje bezpośrednie pytanie, a także omawiasz niektóre przypadki kanałów bocznych, które z pewnością również wykorzystam.
matt wilkie
1
jakiś pomysł, dlaczego to find /dev/disk/ -type l -ilname "*sde*"nie działa?
Aquarius Power,
Wymaga znalezienia GNU.
ceving