2

linux/Ubuntu OS 是否创建了一个表,该表使用存储在硬盘驱动器上的绝对地址来保存每个文件的条目?

只是想知道,因为我打算制作一个文件搜索程序。

我知道有诸如 find 之类的终端命令,但是我将在 CI 中编程时正在考虑 Ubuntu OS 是否有这样的事情,如果有,我该如何访问该表?

更新:

正如有人提到没有这样的事情,那么如果我想制作一个文件搜索程序,我将不得不搜索每个目录的每个文件夹,从程序根目录开始。生成的程序将非常缓慢并且性能很差!那么有没有更好的方法呢?或者我的方法很好!

4

5 回答 5

10

您所描述的“事物”通常称为文件系统,您可能知道有多种可用于 Linux 的文件系统:ext3、ext4、btrfs、Reiser、xfs、jffs 等。

您描述的表可能会很好地映射到 inode-directory 组合。

从我的角度来看,文件在硬盘上的物理位置的整个管理与用户无关,它严格来说是操作系统的域,除非你有一个很好的借口(比如你正在写一个数据恢复程序)和所涉及的文件系统的非常深入的知识。此外,在大多数情况下,文件的存储空间不会是连续的,而是分布在磁盘上的多个位置(片段)上。

但这里更重要的问题可能是:通过这种方式查找文件,您究竟希望达到什么目的?

编辑:根据OP的评论,我认为这里可能存在严重的误解-我看不到绝对文件地址和文件搜索器之间的联系,但这可能是由于我们各自对“绝对地址”的理解存在根本差异在文件系统的上下文中。

如果您只想查看文件系统中的所有文件,您可以

  1. 执行递归目录读取或
  2. 按照 SmartGuyz 的建议使用由 updatedb 准备的数据库

无论如何,您都想查看文件-这就是几乎所有运行时都将花费的地方-我想不出任何优势 2) 会超过 1) 和 2) 具有外部依赖项的缺点,以防万一updatedb 准备的文件必须存在并且非常新鲜。

一个关于遍历目录比旧的 opendir/readdir/closedir 更高级的方法的问题:Efficiently Traverse Directory Tree with opendir(), readdir() and closedir()

EDIT2 基于 OP 的问题附录:是的,遍历目录需要时间,但这就是生命。考虑下一个最好的事情,即定位和朋友。它依赖于一个定期更新(通常每天一次)的“数据库”,因此在最后一次计划更新之后添加或重命名的所有文件不会被发现,而在最后一次计划更新之后删除的文件将在数据库,尽管它们不再存在。假设即使在目标机器上安装了 locate ,您也无法确定。

与编程中的大多数事情一样,查看以前对同一问题的解决方案永远不会有什么坏处,所以我可以建议您阅读GNU findutils的文档吗?

于 2012-10-19T12:25:48.653 回答
4

不,没有文件块地址的单一表,您需要更深入。

首先,文件布局取决于文件系统类型(例如 ext2、ext3、btrfs.reisersf、jfs、xfs 等)。这是由 Linux 内核抽象的,它提供了用于访问许多文件系统上的文件的驱动程序,并且具有其文件系统的特定分区被抽象在单个虚拟文件系统(单个文件目录树,其中包含其他设备作为其子树) )。

所以,基本上不,如果你真的需要检查,你需要使用内核抽象接口(readdir()/proc/mounts)来搜索文件或滚动你自己的用户空间驱动程序(例如通过 FUSE)来检查原始块设备(等)/dev/sda1低级细节(这需要对内核/文件系统内部有很多了解,并且很容易出错)。

于 2012-10-19T12:25:33.630 回答
2
updatedb -l 0 -o db_file -U source_directory

这将创建一个包含文件的数据库,我希望这会对您有所帮助。

于 2012-10-19T12:25:18.467 回答
0

不,文件系统实际上是由目录构成的,每个目录都包含文件和目录。

在 Linux 中,所有这些都通过 inode 管理到内核中。

于 2012-10-19T12:22:59.870 回答
0

是的。

从概念上讲,它确实会为每个文件在光盘上的位置创建一个表**。有很多细节使这张照片略显混乱。

但是,您通常不应该在意。你不想在那个水平上工作,你也不应该。Linux 中有许多文件系统,它们都以略微(或什至显着)不同的方式进行操作。

** 实际上不是物理位置。硬盘驱动器可以通过其固件确定的某种方式将逻辑块映射到物理块。

于 2012-10-19T21:19:10.990 回答