使用相同inode查找所有文件的最快方法是什么?

时间:2009-08-27 10:44:43

标签: linux bash inode

我知道的唯一方法是:

find /home -xdev -samefile file1

但它真的很慢。我想找到像locate这样的工具。 当你有大量文件时会出现真正的问题,我认为操作是O(n)。

4 个答案:

答案 0 :(得分:8)

inode到名称之间没有映射。唯一的方法是遍历整个文件系统,正如您所指出的那样是O(文件数)。 (实际上,我认为它是θ(文件数))。

答案 1 :(得分:5)

这是一种方式:

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

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

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

答案 2 :(得分:4)

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

find . -inum 1234

如果允许这样做,这仍会在所有文件中运行,但是一旦你得到一个匹配,你总是可以手动停止它;我不确定find是否可以选择在单个匹配后停止(可能使用-exec语句?)

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

答案 3 :(得分:-2)

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

除此之外,我认为就是这样。