Как найти все символические ссылки в дереве каталогов? - PullRequest
210 голосов
/ 15 декабря 2011

Я пытаюсь найти все символические ссылки в дереве каталогов для моего сайта. Я знаю, что могу использовать find для этого, но не могу понять, как рекурсивно проверять каталоги.

Я пробовал эту команду:

find /var/www/ -type l

& hellip; и позже я обнаружил, что содержимое в /var/www является символическими ссылками, поэтому я изменил команду на:

find -L /var/www/ -type l

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

Как мне получить это, чтобы проверить подкаталоги?

Ответы [ 6 ]

260 голосов
/ 15 декабря 2011

Это будет рекурсивно проходить по каталогу /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
189 голосов
/ 29 января 2014

Одна команда, без труб

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/

9 голосов
/ 15 декабря 2011

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]$ 
6 голосов
/ 08 апреля 2016

Чтобы увидеть только символические ссылки, вы можете использовать

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

, а если вы хотите увидеть, какие файлы они нацеливают, просто добавьте ls

find -L /path/to/dir/ -xtype l -exec ls -al {} \;
4 голосов
/ 27 января 2014

Это лучшее, что я нашел на данный момент - рекурсивно, но без их показа, отображаются символические ссылки в текущем каталоге с полными путями и другой информацией:

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 голосов
/ 08 апреля 2019

Что я делаю, так это создаю скрипт в каталоге bin, похожий на псевдоним.Например, у меня есть скрипт с именем lsd ls -l |grep ^ d

вы можете сделать один lsl ls -lR |grep ^ l

Просто chmod их + x, и все готово.

...