【问题标题】:symbolic link: find all files that link to this file符号链接:查找链接到该文件的所有文件
【发布时间】:2011-05-31 08:26:20
【问题描述】:

大家好,我需要在 linux 中执行此操作:

  • 给定:文件名“foo.txt”
  • 查找:所有指向“foo.txt”的符号链接的文件

怎么做?谢谢!

【问题讨论】:

标签: linux symlink


【解决方案1】:

这取决于,如果您尝试查找名为 foo.txt, 的特定文件的链接,那么这是唯一的好方法:

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

另一方面,如果您只是想查找到 任何 文件的链接,该文件恰好名为 foo.txt,那么类似

find / -lname foo.txt

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

【讨论】:

  • 问题完美解决。感谢所有回复的人。
  • 正如我对已删除答案的评论,您可以使用 -xtype l 仅查找列表符号链接
  • 您可能想要递归,因为任何指向 foo.txt 的文件本身都可能被其他链接指向...例如:A->B->foo.txt, / tmp/C->B->foo.txt等
  • 如果您的名称组件是链接中命名的父目录,这也可以工作,通过搜索find . -lname '*foo.dir*'(匹配例如file.txt -> ../foo.dir/file.txt
【解决方案2】:

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

$ ls -i foo.txt
41525360 foo.txt

$ find . -follow -inum 41525360

或者,尝试findlname 选项,但是如果你有相对的符号链接,这将不起作用,例如a -> ../foo.txt

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

【讨论】:

  • 如果使用最新版本的 GNU find,您还可以使用 -samefile 选项和 -L 获得相同的效果,而无需自己查找 inode
  • 但这也会在其他文件系统上找到恰好具有相同 inode 编号的文件。
  • 如果foo是一个目录,使用ln -di,在一行中:find . -follow -inum $(ls -di foo.txt |cut -d" " -f1)
  • 这个答案是错误的。符号链接与其目标没有相同的 inode。这仅适用于符号链接文件夹中的文件。但这不是所要求的。
【解决方案3】:

我更喜欢使用symlinks 实用程序,它在搜索损坏的符号链接时也很方便。安装者:

sudo apt install symlinks

显示当前文件夹和子文件夹中的所有符号链接:

symlinks -rv .
  • -r: 递归
  • -v:详细(显示所有符号链接,不仅是损坏的符号链接)

要查找特定的符号链接,只需grep

symlinks -rv . | grep foo.txt

【讨论】:

  • 以前从未听说过symlinks (repo)。 '对于 FTP 站点、CDROM 和 Linux 软件发行版的维护者来说是一个有用的实用程序。它扫描目录中的符号链接并在标准输出上列出它们,通常会揭示文件系统树中的缺陷。古代内核黑客Mark Lord 的伟大的小古老工具,“Linux IDE 性能包、Linux IDE 驱动子系统、hdparm 的原始开发者和维护者”,现在由 J. Brandt Buckley 维护。
  • 效果很好,速度很快。但是请注意,您需要在每个感兴趣的离散分区中进行搜索(因为symlinks 不能可靠地(AFAIK)搜索所谓的“不同文件系统”)。此外,symlinks -rv . 2>/dev/null | grep foo.txt 可能会导致“更干净”的输出...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 2012-12-14
  • 1970-01-01
  • 2021-01-15
  • 2019-02-10
  • 2018-09-02
  • 1970-01-01
相关资源
最近更新 更多