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

我在我的服务器上有一个文件夹,我有一些符号链接指向它。我已经创建了一个新的文件夹,我想改变所有这些符号链接指向新的文件夹。我曾考虑过用指向新文件夹的符号链接替换原来的文件夹,但似乎如果我继续这样做,它会很快变得非常混乱。

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

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

71815 次浏览

我会使用 find 命令。

find . -lname /particular/folder

这将递归地在工作目录中搜索到 /particular/folder的符号链接。注意,它只会找到绝对符号链接。一个类似的命令可以用来搜索所有指向称为“文件夹”的对象的符号链接:

find . -lname '*folder'

从那里你需要剔除任何假阳性。

find / -lname 'fullyqualifiedpathoffile'

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

然后一个 find-inum将找到所有共同的硬链接。

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

实际上没有任何直接的方法来检查这样的符号链接。考虑到您可能有一个并非总是挂载的文件系统(例如,一个外部 USB 驱动器) ,它可能包含指向系统上另一个卷的符号链接。

你可以做点什么:

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

我注意到 FreeBSD 的 find不支持 -lname选项,这就是为什么我最终使用了上面的选项。

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

find . -type l -printf '%p -> %l\n'

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

find /foldername -type l -exec ls -lad {} \;

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

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

大多数命令行工具使用这个函数来处理这种情况。那些不经常遇到符号链接递归问题的人,因为“手工”做这件事很困难(任何知道这件事的人都应该使用上面的函数来代替)。