在Linux / UNIX文件系统中查看目录内容的简单方法


27

过去,我了解到在Linux / UNIX文件系统中,目录只是文件,其中包含目录内文件的文件名和索引节点号。

有没有简单的方法可以查看目录的内容?我的意思是文件名和索引节点的存储/组织方式。

lsfind或者类似的东西。我也不想看到目录中文件的内容。我想看看目录的实现。如果每个目录只是一个包含某些内容的文本文件,则可能存在一种简单的方法来查看此文本文件的内容。

在Linux的bash中,无法执行cat folder。输出为Is a directory

更新问题如何检查unix / linux文件的目录结构信息?解决了同样的问题,但是它没有mjturner提供的解决方案。


我认为不vi <folder>适合您的需求吗?刚刚提到它
Lenniey 2015年

vim <DIR> 这是你想要的吗?
7171u 2015年

首先,请看一下stat命令。stat folder
slm


2
我相信从历史上讲cat会奏效的。但是这种方法在几十年前就已经过时了。我不知道直接查看实际文件系统存储的任何直接方法。取而代之的是,有新的系统调用以标准化格式返回信息,无论使用哪种底层文件系统,该格式均保持不变。
kasperd 2015年

Answers:


35

显示文件系统的inode详细信息的工具将特定于文件系统。对于ext2ext3ext4文件系统(最常见的Linux文件系统),你可以使用debugfs,对于XFS xfs_db,ZFS的zdb。有关btrfs某些信息,可使用该btrfs命令。

例如,要浏览ext4文件系统上的目录(在本例中/dev/sda1):

# ls src
Animation.js    Map.js        MarkerCluster.js    ScriptsUtil.js
Directions.js   MapTypeId.js  markerclusterer.js  TravelMode.js
library.js      MapUtils.js   Polygon.js          UnitSystem.js
loadScripts.js  Marker.js     Polyline.js         Waypoint.js

# ls -lid src
664488 drwxrwxrwx 2 vagrant vagrant 4096 Jul 15 13:24 src

# debugfs /dev/sda1
debugfs: imap <664488>
Inode 664488 is part of block group 81
        located at block 2622042, offset 0x0700
debugfs: dump src src.out
debugfs: quit

# od -c src.out
0000000 250   #  \n  \0  \f  \0 001 002   .  \0  \0  \0 204 030  \n  \0
0000020  \f  \0 002 002   .   .  \0  \0 251   #  \n  \0 024  \0  \f 001
0000040   A   n   i   m   a   t   i   o   n   .   j   s 252   #  \n  \0
0000060 030  \0  \r 001   D   i   r   e   c   t   i   o   n   s   .   j
0000100   s  \0  \0  \0 253   #  \n  \0 024  \0  \n 001   l   i   b   r
0000120   a   r   y   .   j   s  \0  \0 254   #  \n  \0 030  \0 016 001
0000140   l   o   a   d   S   c   r   i   p   t   s   .   j   s  \0  \0
0000160 255   #  \n  \0 020  \0 006 001   M   a   p   .   j   s  \0  \0
0000200 256   #  \n  \0 024  \0  \f 001   M   a   p   T   y   p   e   I
0000220   d   .   j   s 257   #  \n  \0 024  \0  \v 001   M   a   p   U
0000240   t   i   l   s   .   j   s  \0 260   #  \n  \0 024  \0  \t 001
0000260   M   a   r   k   e   r   .   j   s  \0  \0  \0 261   #  \n  \0
0000300 030  \0 020 001   M   a   r   k   e   r   C   l   u   s   t   e
0000320   r   .   j   s 262   #  \n  \0 034  \0 022 001   m   a   r   k
0000340   e   r   c   l   u   s   t   e   r   e   r   .   j   s  \0  \0
0000360 263   #  \n  \0 024  \0  \n 001   P   o   l   y   g   o   n   .
0000400   j   s  \0  \0 264   #  \n  \0 024  \0  \v 001   P   o   l   y
0000420   l   i   n   e   .   j   s  \0 265   #  \n  \0 030  \0 016 001
0000440   S   c   r   i   p   t   s   U   t   i   l   .   j   s  \0  \0
0000460 266   #  \n  \0 030  \0  \r 001   T   r   a   v   e   l   M   o
0000500   d   e   .   j   s  \0  \0  \0 267   #  \n  \0 030  \0  \r 001
0000520   U   n   i   t   S   y   s   t   e   m   .   j   s  \0  \0  \0
0000540 270   #  \n  \0 240 016  \v 001   W   a   y   p   o   i   n   t
0000560   .   j   s  \0 305 031  \n  \0 214 016 022 001   .   U   n   i
0000600   t   S   y   s   t   e   m   .   j   s   .   s   w   p  \0  \0
0000620 312 031  \n  \0   p 016 022 001   .   U   n   i   t   S   y   s
0000640   t   e   m   .   j   s   .   s   w   x  \0  \0  \0  \0  \0  \0
0000660  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0

在上面的代码中,我们首先查找目录src664488)的索引节点,然后将其内容转储到文件中src.out,然后使用进行显示od。如您所见,该目录中所有文件的内容(Animation.js等)在转储中可见。

这仅仅是一个开始-参见debugfs手册页或类型helpdebugfs获取更多信息。

如果您正在使用ext4,可以在内核文档中找到有关目录条目的结构和布局的更多信息。


这是一个很好的答案。非常感谢!现在,我尝试研究如何在此输出中以十进制表示法显示索引节点编号。我认为输出中除文件名之外的值是inode编号。还是我错了?
梦幻岛

@Neverland是的,这些是inode编号。如果od -x用于转储目录条目文件,它们可能会更清晰。
mjturner

0

您可以使用选择的编程语言,像打开文件一样打开目录,然后从生成的文件句柄中读取字节。但是,这不会告诉您太多信息,因为只要您不知道它的组织方式,它就只是垃圾(其中包含一些可识别的字符串)。它的组织方式几乎是有关文件系统的实现问题。如果您想深入研究这些内容,建议您从阅读开始man dirent.h。这足以使您进一步了解自己的想法。


3
Linux不允许这样做...而且我认为大多数确实以统一格式而不是文件系统中实际内容返回数据的系统。
Random832

2
过去(非常)过去,这是可能的。您可以在K&R 2nd Edn中看到这一点的证据。但是,这不再可能;在这个千年的大部分时间里,这都是不可能的。
Jonathan Leffler

在Unix系统上,这是可能的,但不是必需的-如果愿意,可以只使用cat显示内容,但hd(相当于xxd的Unix)可能更有用。我注意到基于Linux的系统在打开目录文件进行读取的情况下会返回错误,假设这是一个错误。“通过阻止愚蠢的人去做愚蠢的事情,您还可以阻止聪明的人去做聪明的事情”。
FJL

0

您可以尝试(分区是一个示例)。

sudo debugfs /dev/xvda1                 

使用dump将inode数据写入文件。

sudo dumpe2fs /dev/xvda1

男人是你的朋友,这些应该给你一些想法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.