如何find目录树中的所有符号链接?

我试图find我的网站目录树中的所有符号链接。 我知道我可以使用find来做到这一点,但我不知道如何recursion检查目录。

我试过这个命令:

 find /var/www/ -type l 

…后来我发现/var/www中的内容是符号链接,所以我将命令更改为:

 find -L /var/www/ -type l 

运行需要一段时间,但是我没有find匹配。

我如何得到这个来检查子目录?

这将recursion地遍历/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手册页中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 

一个命令,没有pipe道:

 find . -type l -ls 

干净利落…

扩展这个答案,这里有几个符号链接相关的find命令:

find特定目标的符号链接

 find . -lname link_target 

请注意, link_target可能包含通配符。

find破碎的符号链接

 find -L . -type l -ls 

-L选项指示find遵循符号链接,除非被破坏。

查找并replace破碎的符号链接

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

更多查找示例

更多的find例子可以在这里find: http : //hamwaves.com/find/

find已经看起来recursion默认情况下:

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

这是迄今为止我发现的最好的东西 – 以recursion方式向您显示当前目录中的符号链接,但没有按照它们显示完整path和其他信息:

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

要只看符号链接本身,可以使用

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

而如果你想看到他们的目标文件,只需要追加一个ls

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