Як знайти всі символьні посилання у дереві каталогів?


253

Я намагаюся знайти всі символьні посилання в дереві каталогів для свого веб-сайту. Я знаю, що можу findце зробити, але не можу зрозуміти, як рекурсивно перевіряти каталоги.

Я спробував цю команду:

find /var/www/ -type l

… І пізніше я виявив, що вміст у - /var/wwwце посилання, тож я змінив команду на:

find -L /var/www/ -type l

потрібно пройти деякий час, однак я не отримую відповідностей.

Як змусити це перевірити підкаталоги?

Відповіді:


299

Це буде рекурсивно переходити до /path/to/folderкаталогу та перераховувати лише символічні посилання:

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

Якщо ви також маєте намір перейти до символічних посилань, вам слід скористатись вашою findкомандою, але ви повинні включити -Lопцію; насправді на findсторінці чоловіка написано:

   -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.

Потім спробуйте це:

find -L /var/www/ -type l

Мабуть, це спрацює: я знайшов на findсторінці чоловіка цей алмаз: якщо ви використовуєте -typeопцію, ви повинні змінити його на -xtypeпараметр:

          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.

Тоді:

find -L /var/www/ -xtype l

1
Дякую, це, мабуть, спрацює, проте я лише зауважив, що вміст / var / www / вже є посиланнями, і це, схоже, не повторюється в ці каталоги.
hafichuk

4
@hafichuk див. остаточну редакцію у моїй відповіді ( find -L /var/www/ -xtype l). Використання -xtypeзамість цього -typeповинно зробити трюк у вашій знахідці. Щасти!
ztank1013

3
Зробіть це, ls -laR /path/to/folder | grep ^lякщо ви також хочете обробити "приховані" крапки папок ...
wimvds

2
Дякую! Але це показує лише назву посилань, але не їх розташування.
Костанос

8
в Mac OSX (10.9), -xtypeнедоступний. find . -type lздається, перевіряється рекурсивно.
амерткара

227

Одна команда, жодних труб

find . -type l -ls

Пояснення: find від поточного каталогу .далі всі посилання -type lчорнила та перераховуйте -lsдетально. Простий і простий ...

Розгорнувши цю відповідь, ось ще кілька символічних findкоманд, пов’язаних із посиланням :

Знайдіть символічні посилання на конкретну ціль

find . -lname link_target

Зауважте, що link_targetце шаблон, який може містити символи підстановки.

Знайдіть розірвані символічні посилання

find -L . -type l -ls

-LІнструктує findслідувати символічним посиланнями, якщо при розбиванні.

Знайдіть і замініть зламані символічні посилання

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

Більше знайдіть приклади

Більше findприкладів можна знайти тут: https://hamwaves.com/find/


7
Якщо ви хочете бути більш лаконічними, можливо, варто згадати, що у більшості версій findє -lsваріант. Так find . -type l -lsмає бути еквівалентом вищезазначеного.
Братчлі

7
Це покращується щодо прийнятої відповіді, оскільки вона також повідомляє про те, де знаходяться символьні посилання в дереві каталогів, що особливо важливо при роботі з видом складного і глибокого дерева, як це, ймовірно, має посилання.
Джессі Кроссен

2
Краще, щоб питання прийняли як кращу відповідь.
Lord_Dracon

3
Ця відповідь набагато корисніша за прийняту. Крім того , якщо ви хочете , щоб знайти посилання які вказують на файли в якому - небудь каталозі: find -lname '*/dir/*' -printf '%P -> %l\n'. Варто згадати, що link_target є зразком.
x-yuri

1
Це мій тип відповіді. Простий і простий. Дякую.
truthadjustr

11

find вже за замовчуванням виглядає рекурсивно:

[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]$ 

Це, мабуть, одна з таких вершин, всі файли в / var / www є посиланнями. Чи findрекурсує це за замовчуванням? Я не здогадуюсь;)
hafichuk

Я, мабуть, щоб уникнути циклу.
jman

Я оновив, щоб використовувати -Lпрапор для пошуку без удачі - будь-які здогади?
hafichuk

Ідеальне рішення, і воно показує розташування посилань. Дякую!
Костанос

8

Щоб побачити лише самі посилання, ви можете використовувати

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

тоді як, якщо ви хочете також бачити, на які файли вони націлені, просто додайте допис

find -L /path/to/dir/ -xtype l -exec ls -al {} \;

6

Це найкраще, що я знайшов поки що - показує вам символьні посилання в поточному каталозі, рекурсивно, але без їх дотримання, відображаються з повними шляхами та іншою інформацією:

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

Виходи виглядає приблизно так:

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...

0

Що я роблю, це створити скрипт у моєму каталозі бін, який є як псевдонім. Наприклад, у мене є сценарій під назвою lsd ls -l | греп ^ д

ви могли зробити один lsl ls -lR | греп ^ л

Просто chmod їх + x, і ви добре піти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.