12

我知道的唯一方法是:

find /home -xdev -samefile file1

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

4

4 回答 4

10

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

于 2009-08-29T12:53:03.983 回答
8

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

find . -inum 1234

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

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

于 2014-08-18T17:02:51.480 回答
7

这里有一个方法:

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

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

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

于 2009-08-27T10:52:59.587 回答
-2

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

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

于 2009-08-27T10:52:28.760 回答