Jak znaleźć wszystkie dowiązania symboliczne wskazujące dowolny plik / katalog w danym katalogu

15

Na to pytanie lub na to (na przykład) dostaniesz rozwiązania, jak szukać dowiązań symbolicznych wskazujących na dany katalog (nazwijmy go /dir1), podczas gdy ja jestem zainteresowany symbolicznymi linkami, które mogą wskazywać na dowolny plik / folder w środku /dir1.

Chcę usunąć taki katalog, ale nie jestem pewien, czy mogę to zrobić bezpiecznie, ponieważ w innym katalogu (nazwijmy go /dir2) mogę mieć dowiązania symboliczne do wewnętrznych części /dir1.

Ponadto mogłem utworzyć te dowiązania symboliczne przy użyciu ścieżek bezwzględnych lub względnych. Moją jedyną pomocą jest to, że wiem, że dowiązania symboliczne, które chcę sprawdzić, znajdują się w zamontowanym systemie plików /dir2.

Antonello
źródło

Odpowiedzi:

15

Wszystkie dowiązania symboliczne można znaleźć, używając:

find / -type l 

możesz uruchomić to jako root, aby dostać się do każdego miejsca na dysku.

Możesz je rozwinąć, readlink -faby uzyskać pełną ścieżkę do linku, i powinieneś być w stanie uzyskać grepdane wyjściowe względem katalogu docelowego, który rozważasz do usunięcia:

find / -type l -exec readlink -f {} + | grep -F /dir2

Używanie find / -type l -printf '%l\n'nie działa, ponieważ otrzymujesz linki względne, ../tmp/xyzktóre mogą wskazywać na docelowy katalog, ale nie są dopasowane, ponieważ nie są w pełni rozwinięte.

Anthon
źródło
1
W przypadku poddrzewa przydatne może być śledzenie dowiązań symbolicznych:find -L /subtree -xtype l -exec readlink -f {} +
ruvim
3

W moim przypadku zaakceptowana odpowiedź nie była przydatna (ponieważ nie wygenerowała źródła linku). Oto, co zadziałało dla mnie.

Obejrzałem to, używając dwóch -execklauzul:

find /home/ -type l -exec readlink -nf {} ';' -exec echo " -> {}" ';' | grep "/dir2"
Dorian Marchal
źródło
1

Z zsh:

printf '%s\n' /dir2/**/*(D@e'([[ $REPLY:P = /dir1(/*|) ]])')
Stéphane Chazelas
źródło