dowiązanie symboliczne: znajdź wszystkie pliki, które prowadzą do tego pliku

Odpowiedzi:

132

To zależy, jeśli próbujesz znaleźć linki do określonego pliku, który jest wywoływany, foo.txt,jest to jedyny dobry sposób:

find -L / -samefile path/to/foo.txt

Z drugiej strony, jeśli po prostu próbujesz znaleźć linki do dowolnego pliku, który ma nazwę foo.txt, to coś w rodzaju

find / -lname foo.txt

lub

find . -lname \*foo.txt # ignore leading pathname components
DigitalRoss
źródło
problem rozwiązany pięknie. Dziękuję wszystkim, którzy odpowiedzieli.
lukmac
8
Jak skomentowałem usuniętą odpowiedź, możesz użyć, -xtype laby znaleźć tylko listę linków symbolicznych
Hasturkun
możesz chcieć powtórzyć, ponieważ każdy z plików wskazujących na foo.txt może być wskazany przez inne linki ... np .: A-> B-> foo.txt, / tmp / C-> B-> foo.txt, itp.
Olivier Dulac,
to też może zadziałać, jeśli komponent nazwy jest katalogiem nadrzędnym wymienionym w linku, wyszukując find . -lname '*foo.dir*'(pasuje np. file.txt -> ../foo.dir/file.txt)
Yonatan
22

Znajdź numer i-węzła pliku, a następnie wyszukaj wszystkie pliki o tym samym numerze i-węzła:

$ ls -i foo.txt
41525360 foo.txt

$ find . -follow -inum 41525360

Alternatywnie wypróbuj lnameopcję find, ale to nie zadziała, jeśli masz względne linki symboliczne, npa -> ../foo.txt

$ find . -lname /path/to/foo.txt
dogbane
źródło
3
Jeśli używasz najnowszej wersji GNU find, możesz również użyć -samefileopcji z -Ldla tego samego efektu, bez konieczności samodzielnego wyszukiwania i-węzła
Hasturkun
5
Ale spowoduje to również znalezienie plików w innych systemach plików, które mają ten sam numer i-węzła.
DigitalRoss
Jeśli foojest to katalog, użyj ln -diw jednej linii:find . -follow -inum $(ls -di foo.txt |cut -d" " -f1)
rubo77
1
Ta odpowiedź jest błędna. Dowiązanie symboliczne nie ma tego samego i-węzła, co jego cel. Będzie to działać tylko dla pliku znajdującego się w folderze z dowiązaniem symbolicznym. Ale nie o to pytano.
Jules Lamur,
4

Wolę używać symlinksnarzędzia, które jest również przydatne podczas wyszukiwania uszkodzonych linków symbolicznych. Zainstaluj przez:

sudo apt install symlinks

Pokaż wszystkie linki symboliczne w bieżącym folderze i podfolderach:

symlinks -rv .
  • -r: rekurencyjny
  • -v: verbose (pokaż wszystkie linki symboliczne, nie tylko uszkodzone)

Aby znaleźć określone łącze symboliczne, wystarczy grep:

symlinks -rv . | grep foo.txt
Nik
źródło