【问题标题】:What is the fastest way to find all the file with the same inode?查找具有相同 inode 的所有文件的最快方法是什么?
【发布时间】:2010-11-23 08:09:09
【问题描述】:

我知道的唯一方法是:

find /home -xdev -samefile file1

但它真的很慢。我想找一个像locate 这样的工具。 当你有很多文件时,真正的问题来了,我想操作是 O(n)。

【问题讨论】:

标签: linux bash inode


【解决方案1】:

没有从inode 到名称的映射。唯一的方法是遍历整个文件系统,正如您所指出的,这是 O(文件数)。 (其实我觉得是θ(文件数))。

【讨论】:

    【解决方案2】:

    我知道这是一个老问题,但是find 的许多版本都有一个inum 选项来轻松匹配已知的inode 编号。您可以使用以下命令执行此操作:

    find . -inum 1234
    

    如果允许的话,这仍然会遍历所有文件,但是一旦你找到匹配项,你总是可以手动停止它;我不确定find 是否可以选择在单场比赛后停止(可能使用-exec 语句?)

    这比将输出转储到文件、排序等和其他方法要容易得多,因此应在可用时使用。

    【讨论】:

    • 很好的答案。甚至我的旧 gentoo 服务器也找到了 -inum 选项。
    • 要停止第一场比赛,您可以尝试find . -inum 1234 | head -n1
    • 这与-samefile 的作用相同,只是您必须自己找到inode。它让事情变得更慢。
    【解决方案3】:

    这是一种方法:

    • 使用find -printf "%i:\t%p 或类似方法创建以inode 为前缀的所有文件的列表,并输出到临时文件
    • 提取第一个字段 - 附加了 ':' 的 inode - 并排序以将重复项放在一起,然后限制为重复项,使用 cut -f 1 | sort | uniq -d,并将其输出到第二个临时文件
    • 使用fgrep -f 将第二个文件加载为字符串列表以搜索和搜索第一个临时文件。

    (当我写这篇文章时,我将这个问题解释为查找所有具有重复 inode 的文件。当然,可以将前半部分的输出用作一种索引,从 inode 到路径,就像如何定位作品。)

    在我自己的机器上,我经常使用这些类型的文件,并将它们分类。我还有一个文本索引器应用程序,它可以应用二进制搜索来快速找到所有具有公共前缀的行。这样的工具最终对这样的工作非常有用。

    【讨论】:

      【解决方案4】:

      我通常会做的是:ls -i <file> 获取该文件的 inode,然后是 find /dir -type f -inum <inode value> -mount。 (您希望-mount 避免在不同的文件系统上进行搜索,这可能是您的性能问题的一部分。)

      除此之外,我认为仅此而已。

      【讨论】:

      • 他已经在使用-xdev,和-mount一样。所以这也好不到哪里去。
      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 2010-09-12
      • 2016-05-14
      • 1970-01-01
      • 2021-02-10
      • 2017-09-30
      相关资源
      最近更新 更多