有没有办法检查是否有指向目录的符号链接?

Is there a way to check if there are symbolic links pointing to a directory?

提问人:nickf 提问时间:9/19/2008 最后编辑:the Tin Mannickf 更新时间:7/28/2021 访问量:74198

问:

我的服务器上有一个文件夹,我有许多符号链接指向该文件夹。从那以后,我创建了一个新文件夹,我想更改所有这些符号链接以指向新文件夹。我曾考虑过用指向新文件夹的符号链接替换原始文件夹,但似乎如果我继续这种做法,它可能会很快变得非常混乱。

我一直在做的是手动更改符号链接以指向新文件夹,但我可能错过了几个。

有没有办法检查是否有任何指向特定文件夹的符号链接?

Linux 符号链接

评论


答:

92赞 skymt 9/19/2008 #1

我会使用 find 命令。

find . -lname /particular/folder

这将递归地搜索当前目录中的符号链接。请注意,它只会找到绝对符号链接。类似的命令可用于搜索指向名为“folder”的对象的所有符号链接:/particular/folder

find . -lname '*folder'

从那里,您需要清除任何误报。

评论

4赞 nickf 9/19/2008
谢谢,效果很好。对于其他尝试此操作的人:使用 -maxdepth 开关确实有助于加快搜索速度,因为我知道链接的深度。
1赞 regilero 7/2/2013
谢谢。请注意,链接中是否存在尾部斜杠可能会改变结果。所以你可能需要一个find . -lname '*folder?'
0赞 Olivier Dulac 11/8/2013
...对于每场比赛,还要找到该比赛的积分!(例如:/a/A -> /some/b -> /particular/folder ...链条可能会更长)
1赞 bfabry 9/19/2008 #2
find / -lname 'fullyqualifiedpathoffile'
1赞 paxdiablo 9/19/2008 #3

对于硬链接,您可以使用“ls”选项之一(我认为)获取目录的 inode。-i

然后 with 将找到所有常见的硬链接。find-inum

对于软链接,您可能需要对所有文件执行一个查找“->”之后的文本并将其规范化以确保它是绝对路径。ls -l

评论

0赞 Thomee 9/20/2008
这对于查找文件的所有硬链接非常有效。但是指向目录的硬链接是一个很大的禁忌。文件系统驱动程序不会让你创建这样的东西,如果你受虐狂到手动编辑原始分区来创建一个,它会让很多事情非常不愉快。
0赞 Tom Andersen 10/30/2012
我也不建议使用文件夹的硬链接,但 OS X 上的 TimeMachine 会使用它们。例如:belkadan.com/blog/2011/07/rm-vs-Time-Machine
6赞 Greg Hewgill 9/19/2008 #4

实际上没有任何直接的方法来检查此类符号链接。考虑您可能有一个未始终挂载的文件系统(例如外部 USB 驱动器),其中可能包含指向系统上另一个卷的符号链接。

你可以用以下方法做一些事情:

for a in `find / -type l`; do echo "$a -> `readlink $a`"; done | grep destfolder

我注意到 FreeBSD 不支持该选项,这就是我最终选择上述选项的原因。find-lname

2赞 stephanea 9/19/2008 #5

除了查看所有其他文件夹是否有指向原始文件夹的链接之外,我认为这是不可能的。如果是,我会很感兴趣。

5赞 no1uknow 10/8/2010 #6
find . -type l -printf '%p -> %l\n'
7赞 JJK 3/13/2012 #7

您可以使用 Mark Lord 编写的符号链接程序来审核符号链接——它将扫描整个文件系统,将符号链接路径规范化为绝对形式并将它们打印到 stdout。

1赞 Lunar Mushrooms 1/3/2014 #8
find /foldername -type l -exec ls -lad {} \;

评论

0赞 Vik 9/24/2014
这在 Mac 上效果很好。 谢谢。在一个由 wordpress 黑客完成的网站上发现了一些恶意符号链接。真。谢谢。
0赞 Thomas Tempelmann 7/28/2021 #9

对于任何在这里查看的程序员(cmdline 工具问题现在可能应该转到 unix.stackexchange.com):

您应该知道,Linux/BSD 函数为您提供了一个易于使用的迭代器,用于遍历所有子目录内容,同时还可以检测此类符号链接递归。fts_open()

大多数命令行工具都使用此函数来处理这种情况。那些通常不会遇到符号链接递归问题的人,因为“手动”执行此操作很困难(任何知道它的人都应该使用上述函数)。