当我执行一个简单的文件系统时,看到find iterate/遍历完整的文件系统,这让我感到惊讶。
find -inum 12345
没有背景信息,在我看来,应该有更容易的方法来告诉所有的文件与这个特定的inode 12345 (这只是一个占位符这里)?
有什么更好的方法吗?它不需要检查文件系统的所有目录结构,只需判断哪个文件名与inode相关?
还有一个问题是解决快速查找哪个文件(S)属于特定的inode编号.问题的,目的是找到更好(更快)的方法。
这个问题更直接的是,首先要知道为什么会出现这样的问题?可能有一个很好的理由与权限等相关,这将使用户故意难以避免遍历目录结构来查找所有文件名到inode。
然而,似乎很奇怪,任何文件系统都会遇到这样的问题,将所有文件名告诉inode (至少是特权root
)用户。
我最感兴趣的文件系统是ext4。
发布于 2014-10-11 10:34:20
最简单的原因是,至少对于ext2 2/ext2 3/ext2 4类型的文件系统,文件名是通过存储在目录类型文件中的目录条目数据来存储的。
这意味着来自类型目录的文件有一个或多或少复杂的系统来存储文件名(目录中的文件)和指向这些文件的数据的inode。
稍微简化(ext3 3/4使用哈希表增强,以加快目录树遍历等.)它看起来像这样的一个清单:
## filenames ## ## inode-numbers ##
filename1 0123
filename2 01242
anotherfilename 3313
yetanotherfilename 11233
基本上,文件名只发生在与direcotry文件相关的数据中,而不是存储在文件系统存储的/inode元数据中的任何地方。因此,获取与inode编号相关的文件名的唯一方法是遍历所有目录文件的所有目录条目。
发布于 2014-10-12 14:16:06
你写道:
当我执行一个简单的find -inum 12345时,看到find /遍历完整的文件系统,这让我感到惊讶。
根据定义,find
从给定的目录开始遍历树,而默认的起始目录为.
。
find -inum 12345
将从当前工作目录开始遍历整个目录树。除非.
碰巧包含文件系统挂载点,否则它可能不会遍历整个文件系统。
有更有效的方法可以在链接到的答案中找到具有给定inode号的所有文件-- fsdb
、debugfs
和ncheck
--但是由于标准,find
必须执行树遍历。注意,如果您要查找的inode只有一个链接,您可以给find
-quit
选项(如果它支持它),以便在第一次匹配之后结束树的遍历。
即使这些其他命令也不总是快速的,部分原因是它们必须查看整个文件系统,而不仅仅是目录树,但是它们会尽最大努力处理可使用的数据。基本问题是大多数Unix文件系统的结构。
..
的inode编号,因此只需要搜索一个目录就可以找到匹配的条目。(有一个例外:文件系统的根目录有一个指向同一目录的..
条目。)发布于 2019-04-08 20:38:12
一个简单的答案可能是类比。
想象一下,在电话簿上搜索一个电话号码而不是一个名字。
https://unix.stackexchange.com/questions/160573
复制