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

Bre*_*ght 8 linux bash inode

我知道的唯一方法是:

find /home -xdev -samefile file1
Run Code Online (Sandbox Code Playgroud)

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

Jör*_*tag 8

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


Har*_*ikk 8

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

find . -inum 1234
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这与“-samefile”的作用相同,只是你必须自己找到索引节点。它让事情变得更慢。 (2认同)

Bar*_*lly 5

这是一种方式:

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

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

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