67

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

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

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

4

9 回答 9

85

我会使用 find 命令。

find . -lname /particular/folder

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

find . -lname '*folder'

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

于 2008-09-19T07:15:09.810 回答
7

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

于 2012-03-13T10:46:03.310 回答
6

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

你可以做一些事情:

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

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

于 2008-09-19T07:19:03.293 回答
4
find . -type l -printf '%p -> %l\n'
于 2010-10-08T15:26:08.630 回答
2

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

于 2008-09-19T07:19:39.550 回答
1
find / -lname 'fullyqualifiedpathoffile'
于 2008-09-19T07:16:28.370 回答
1

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

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

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

于 2008-09-19T07:17:41.083 回答
1
find /foldername -type l -exec ls -lad {} \;
于 2014-01-03T12:50:31.850 回答
0

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

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

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

于 2021-07-28T12:06:45.480 回答