符号链接:查找所有链接到此文件的文件

140

大家好,我需要在 Linux 中完成以下操作:

  • 已知文件名为 'foo.txt'
  • 查找所有符号链接到 'foo.txt' 的文件

如何操作?谢谢!


3个回答

168

这取决于你想要查找名为foo.txt的特定文件的链接,那么这是唯一可行的方法:

find -L / -samefile path/to/foo.txt

另一方面,如果你只是想找到链接到任何名为 foo.txt 的文件,则可以使用类似于以下内容:

find / -lname foo.txt
或者
find . -lname \*foo.txt # ignore leading pathname components

问题美妙地解决了。感谢所有回复的人。 - lukmac
9
如我在被删除的回答中所评论的那样,你可以使用“-xtype l”来仅查找列表符号链接。 - Hasturkun
你可能需要递归,因为任何指向foo.txt的文件本身都可能被其他链接所指向...例如:A->B->foo.txt,/tmp/C->B->foo.txt等。 - Olivier Dulac
如果您的名称组件是在链接中命名的父目录,那么此方法也可以工作,通过搜索 find . -lname '*foo.dir*'(例如匹配 file.txt -> ../foo.dir/file.txt)。 - Yonatan
这个答案非常有帮助,非常感谢。顺便说一下,如果我们想获取更多关于“find”结果的信息,我们可以将“find”的输出传递给“ls”:find -L /usr -samefile /usr/share/pyshared/lsb_release.py 2>/dev/null | xargs ls -al - MadHatter

25

查找文件的inode号码,然后搜索所有具有相同inode号码的文件:

$ ls -i foo.txt
41525360 foo.txt

$ find . -follow -inum 41525360

另外,也可以尝试使用findlname选项,但如果您有相对符号链接(例如a -> ../foo.txt),则此方法将不起作用。

$ find . -lname /path/to/foo.txt

4
如果使用最近版本的GNU find工具,你还可以在使用-L选项时,结合使用-samefile选项来达到同样的效果,而无需自行查找i-node节点。 - Hasturkun
5
但是这也会找到其他文件系统上具有相同inode号的文件。 - DigitalRoss
如果foo是一个目录,则使用ln -di,在一行中:find . -follow -inum $(ls -di foo.txt |cut -d" " -f1) - rubo77
1
这个答案是错误的。符号链接的inode与其目标不同。这只适用于符号链接文件夹内部的文件。但这不是问题所问的。 - Jules Lamur

9

我更喜欢使用symlinks实用程序,这也在搜寻损坏的符号链接时非常方便。安装方法如下:

sudo apt install symlinks

显示当前文件夹及其子文件夹中的所有符号链接:
ls -laR | grep "\-\>"
symlinks -rv .
  • -r: 递归
  • -v: 显示所有符号链接,而不仅仅是损坏的 (verbose)

要找到特定的符号链接,只需使用grep命令:

symlinks -rv . | grep foo.txt

1
以前从未听说过symlinksrepo)。这是一个非常有用的工具,适用于FTP站点、CDROM和Linux软件分发的维护者。它扫描符号链接目录并将它们列在stdout上,通常会显示文件系统树中的缺陷。这是由古老的内核黑客Mark Lord开发的伟大小工具,他是“Linux IDE驱动程序子系统,hdparm”的原始开发人员和维护者。现在由J. Brandt Buckley维护。 - cachius
运行良好且速度快。但请注意,您需要在每个感兴趣的离散分区中进行搜索(因为“symlinks”不能可靠地(据我所知)跨所谓的“不同文件系统”进行搜索)。此外,“symlinks -rv . 2>/dev/null | grep foo.txt”可能会产生更“干净”的输出... - Digger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接