Как найти все символические ссылки в дереве каталогов?

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

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

find /var/www/ -type l

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

find -L /var/www/ -type l

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

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

5 ответов


это будет рекурсивно траверс /path/to/folder каталог и список только символических ссылок:

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

если вы намерены следовать символическим ссылкам, вы должны использовать свой find команда, но вы должны включить -L вариант; на самом деле find man page говорит:

   -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 man page этот алмаз: если вы используете вы должны измените его на :

          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

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

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/


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

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

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

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

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

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

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