Jak znaleźć wszystkie dowiązania symboliczne w drzewie katalogów?

253

Próbuję znaleźć wszystkie dowiązania symboliczne w drzewie katalogów mojej witryny. Wiem, że mogę findto zrobić, ale nie wiem, jak rekurencyjnie sprawdzić katalogi.

Próbowałem tego polecenia:

find /var/www/ -type l

… A później odkryłem, że zawartość w /var/wwwto dowiązania symboliczne, więc zmieniłem polecenie na:

find -L /var/www/ -type l

biegnie trochę czasu, ale nie dostaję żadnych zapałek.

Jak mogę to sprawdzić, aby sprawdzić podkatalogi?

hafichuk
źródło

Odpowiedzi:

299

Spowoduje to rekurencyjne przechodzenie przez /path/to/folderkatalog i wyświetlanie tylko dowiązań symbolicznych:

ls -lR /path/to/folder | grep ^l

Jeśli zamierzasz również podążać za dowiązaniami symbolicznymi, powinieneś użyć swojego findpolecenia, ale powinieneś dołączyć -Lopcję; w rzeczywistości findstrona man mówi:

   -L     Follow symbolic links.  When find examines or prints information
          about files, the information used shall be taken from the  prop‐
          erties  of  the file to which the link points, not from the link
          itself (unless it is a broken symbolic link or find is unable to
          examine  the file to which the link points).  Use of this option
          implies -noleaf.  If you later use the -P option,  -noleaf  will
          still  be  in  effect.   If -L is in effect and find discovers a
          symbolic link to a subdirectory during its search, the subdirec‐
          tory pointed to by the symbolic link will be searched.

          When the -L option is in effect, the -type predicate will always
          match against the type of the file that a symbolic  link  points
          to rather than the link itself (unless the symbolic link is bro‐
          ken).  Using -L causes the -lname and -ilname predicates  always
          to return false.

Następnie spróbuj tego:

find -L /var/www/ -type l

Prawdopodobnie to zadziała: znalazłem na findstronie podręcznika ten diament: jeśli używasz -typeopcji, musisz zmienić ją na -xtypeopcję:

          l      symbolic link; this is never true if the -L option or the
                 -follow option is in effect, unless the symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

Następnie:

find -L /var/www/ -xtype l
ztank1013
źródło
1
Dzięki, to prawdopodobnie zadziałałoby, ale właśnie zauważyłem, że zawartość / var / www / jest już dowiązaniami symbolicznymi i wydaje się, że nie powraca ona do tych katalogów.
hafichuk
4
@hafichuk patrz końcowa edycja w mojej odpowiedzi ( find -L /var/www/ -xtype l). Używanie -xtypezamiast -typepowinno załatwić sprawę w twoim znalezisku. Powodzenia!
ztank1013,
3
Zrób to, ls -laR /path/to/folder | grep ^ljeśli chcesz również przetwarzać „ukryte” foldery z kropkami ...
wimvds,
2
Dziękuję Ci! Ale pokazuje to tylko nazwę linków, ale nie ich lokalizację.
Kostanos
8
w Mac OSX (10.9) -xtypenie jest dostępny. find . -type lwydaje się sprawdzać rekurencyjnie.
amertkara
227

Jedno polecenie, bez rur

find . -type l -ls

Objaśnienie: find z bieżącego katalogu .wszystkie odniesienia do -type latramentu i -lsich szczegółowe zestawienie . Prosty i prosty ...

Rozwijając tę ​​odpowiedź, oto kilka innych findpoleceń związanych z dowiązaniem symbolicznym :

Znajdź dowiązania symboliczne do określonego celu

find . -lname link_target

Zauważ, że link_targetjest to wzorzec, który może zawierać znaki wieloznaczne.

Znajdź zepsute linki symboliczne

find -L . -type l -ls

Ta -Lopcja nakazuje findpodążać za dowiązaniami symbolicznymi, chyba że są uszkodzone.

Znajdź i zamień zepsute linki symboliczne

find -L . -type l -delete -exec ln -s new_target {} \;

Więcej znajdź przykłady

Więcej findprzykładów można znaleźć tutaj: https://hamwaves.com/find/

Serge Stroobandt
źródło
7
Jeśli chcesz być bardziej zwięzły, warto wspomnieć, że większość wersji findma -lsopcję. Tak find . -type l -lspowinno być równoznaczne z powyższych.
Bratchley,
7
Poprawia to przyjętą odpowiedź, ponieważ informuje również, gdzie znajdują się dowiązania symboliczne w drzewie katalogów, co jest szczególnie ważne przy pracy z rodzajem złożonego i głębokiego drzewa, które prawdopodobnie może zawierać dowiązania symboliczne.
Jesse Crossen
2
Lepiej, żeby pytanie zostało zaakceptowane jako lepsza odpowiedź.
Lord_Dracon
3
Ta odpowiedź jest znacznie bardziej przydatna niż zaakceptowana. Ponadto, jeśli chcesz znaleźć ten punkt dowiązania symboliczne do plików w jakimś katalogu: find -lname '*/dir/*' -printf '%P -> %l\n'. Warto wspomnieć, że link_target jest wzorem.
x-yuri,
1
To jest mój typ odpowiedzi. Prosty i prosty. Dzięki.
truthadjustr
11

find już domyślnie wygląda rekurencyjnie:

[15:21:53 ~]$ mkdir foo
[15:22:28 ~]$ cd foo
[15:22:31 ~/foo]$ mkdir bar
[15:22:35 ~/foo]$ cd bar
[15:22:36 ~/foo/bar]$ ln -s ../foo abc
[15:22:40 ~/foo/bar]$ cd ..
[15:22:47 ~/foo]$ ln -s foo abc
[15:22:52 ~/foo]$ find ./ -type l
.//abc
.//bar/abc
[15:22:57 ~/foo]$ 
jman
źródło
Jest to prawdopodobnie jeden z tych gotcha, wszystkie pliki w / var / www dowiązaniami symbolicznymi. Czy findrekursje te są domyślnie? Chyba nie;)
hafichuk
Tak, prawdopodobnie aby uniknąć zapętlenia.
jman
Zaktualizowałem używanie -Lflagi do znalezienia bez powodzenia - jakieś zgadnięcia?
hafichuk
Idealne rozwiązanie i pokazuje lokalizację linków. Dziękuję Ci!
Kostanos
8

Aby zobaczyć same dowiązania symboliczne, możesz użyć

find -L /path/to/dir/ -xtype l 

podczas gdy jeśli chcesz zobaczyć, które pliki są celem, po prostu dodaj ls

find -L /path/to/dir/ -xtype l -exec ls -al {} \;
MariusPontmercy
źródło
6

To najlepsza rzecz, jaką do tej pory znalazłem - pokazuje dowiązania symboliczne w bieżącym katalogu, rekurencyjnie, ale bez ich śledzenia, wyświetlane z pełnymi ścieżkami i innymi informacjami:

find ./ -type l -print0 | xargs -0 ls -plah

dane wyjściowe wyglądają mniej więcej tak:

lrwxrwxrwx 1 apache develop 99 Dec  5 12:49 ./dir/dir2/symlink1 -> /dir3/symlinkTarget
lrwxrwxrwx 1 apache develop 81 Jan 10 14:02 ./dir1/dir2/dir4/symlink2 -> /dir5/whatever/symlink2Target
etc...
siliconrockstar
źródło
0

To, co robię, to tworzenie skryptu w katalogu bin, który jest jak alias. Na przykład mam skrypt o nazwie lsd ls -l | grep ^ d

możesz zrobić jeden lsl ls -lR | grep ^ l

Wystarczy chmod je + x i jesteś gotowy.

Alex M.
źródło