【问题标题】:How do I read a directory as a file in Unix?如何在 Unix 中将目录作为文件读取?
【发布时间】:2010-12-12 03:47:50
【问题描述】:

我了解目录只是 unix 中的一个文件,其中包含文件的 inode 编号和名称。我怎么看这个?我不能在目录上使用 cat 或 less,在 vi 中打开它只会显示文件列表...没有 inode 编号。

【问题讨论】:

  • 没有 API 来获取目录的原始内容。但是,出于调试或教育目的,您可以使用debugfs(仅适用于 ext2 fs)。您可以使用debugfs -R 'dump_inode /your_dir tmpfile' /dev/sda1,然后使用hexdump -C tmpfile

标签: unix inode dir


【解决方案1】:

既然这是一个编程问题(它一个编程问题,不是吗?),您应该查看opendirreaddirclosedir 函数。这些是单一 UNIX 规范的一部分。

#include <sys/types.h>
#include <dirent.h>

DIR *opendir (const char *dirname);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);

dirent.h 文件应具有您需要的结构,至少包含:

char   d_name[]    name of entry
ino_t  d_ino       file serial number

请参阅 here 以获取 readdir 联机帮助页 - 它包含指向其他联机帮助页的链接。

请记住,存储在其目录条目中的文件信息量很少。 inode 本身包含您从 stat 函数获得的内容,例如时间、大小、所有者、权限等,以及指向实际文件内容的所有重要指针。

【讨论】:

  • 啊,我明白了。但是有什么方法可以查看文件的文字实际内容吗?也许这个例子会更清楚:在我的设置中,我可以输入“less /bin/ls”来查看ls的内容。显然,它以任何方式都无法辨认,但我仍然可以看到它。我可以以某种方式对目录做同样的事情吗?这不是一个实际的问题,更多的是我很好奇 Unix 是否允许用户做这样的事情。
  • 我从未见过能够执行此操作的用户级命令(这并不意味着它不存在)。但是,通过一些工作,您可以(从父目录)获取您感兴趣的实际目录的 inode,并在硬盘上遍历实际结构,假设您具有必要的权限。
  • 完美,谢谢。看起来没有简单的解决方案,但通过谷歌搜索发现有一些 C 函数值得研究。
【解决方案2】:

在过去——版本 7、System III、早期 System V——你确实可以打开一个目录并将内容读入内存,尤其是对于具有 2 字节 inode 编号和 14 字节限制的旧 Unix 文件系统在文件名上。

随着更奇特的文件系统变得越来越流行,不得不使用 opendir()、readdir()、closedir() 系列函数调用,因为解析目录的内容变得越来越不简单。

最后,在过去十年左右的时间里,它已经达到了在大多数系统上无法读取目录的地步;您可以打开它(主要是这样 fchdir() 等操作才能工作),并且您可以使用 opendir() 系列调用来读取它。

【讨论】:

    【解决方案3】:

    看起来stat command 可能是正常的。来自文章:

    stat /etc/passwd
    
        File: `/etc/passwd'
        Size: 2911                Blocks: 8 IO    Block: 4096 regular file
        Device: fd00h/64768d      Inode: 324438   Links: 1
        Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
        Access: 2008-08-11 05:24:17.000000000 -0400
        Modify: 2008-08-03 05:11:05.000000000 -0400
        Change: 2008-08-03 05:11:05.000000000 -0400
    

    【讨论】:

    • stat 命令提供了有关文件或目录的基本信息,但它并没有告诉我有关其中文件的任何信息。例如,在 /etc 指向的目录上使用“stat”给我: 234881026 2995 drwxr-xr-x 91 root wheel 0 3094 "Oct 29 11:27:39 2009" "Sep 26 23:09:45 2009" “2009 年 9 月 26 日 23:09:45”4096 0 0 /private/etc
    • 在一般实践中,statvfs() 是更可取的函数。
    猜你喜欢
    • 2015-05-28
    • 2023-03-31
    • 1970-01-01
    • 2019-08-26
    • 2013-02-03
    • 2012-06-28
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多