如何在目录树中找到所有符号链接?


253

我试图在我的网站的目录树中找到所有符号链接。我知道我可以find用来执行此操作,但是我不知道如何递归检查目录。

我已经尝试过以下命令:

find /var/www/ -type l

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

find -L /var/www/ -type l

需要一段时间才能运行,但是我没有找到任何匹配。

我该如何检查子目录?

Answers:


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 2011年

4
@hafichuk在我的答案(find -L /var/www/ -xtype l)中查看最终编辑。使用-xtype而不是-type应该可以解决您的问题。祝好运!
ztank1013 2011年

3
作出这样的ls -laR /path/to/folder | grep ^l,如果你也想的过程“隐藏的”点文件夹...
wimvds

2
谢谢!但这仅显示链接的名称,而不显示它们的位置。
Kostanos

8
在Mac OSX(10.9)-xtype中不可用。find . -type l似乎正在递归检查。
amertkara

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应与上述等效。
布拉奇利2014年

7
这会改善已接受的答案,因为它还会告诉您符号链接在目录树中的何处,特别是在使用可能具有符号链接的复杂树和深树时,这一点尤其重要。
Jesse Crossen 2014年

2
更好的是,问题被接受为更好的答案。
Lord_Dracon

3
这个答案远比公认的答案有用。另外,如果您想找到指向某些目录中文件的符号链接:find -lname '*/dir/*' -printf '%P -> %l\n'。值得一提的是link_target是一种模式。
x-yuri

1
这是我的答案。干净利落。谢谢。
trueadjustr

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 2011年

是的,可能是为了避免循环。
jman 2011年

我已更新-L为在没有任何运气的情况下使用该标志进行查找-有任何猜测吗?
hafichuk 2011年

完美的解决方案,它显示了链接的位置。谢谢!
Kostanos 2014年

8

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

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

而如果您还想查看它们所针对的文件,只需添加ls

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

我要做的是在我的bin目录中创建一个脚本,就像一个别名。例如,我有一个名为lsd ls -l |的脚本。grep ^ d

您可以制作一个lsl ls -lR | grep ^ l

只需对它们+ x进行chmod操作,就可以了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.