过去,我了解到在Linux/UNIX文件系统中,目录只是文件,其中包含目录内文件的文件名和inode号。
有没有一个简单的方法看目录的内容?我的意思是文件名和索引节点的存储/组织方式。
我是不是寻找ls
,find
或类似的东西。我也不想看到目录中文件的内容。我想看看目录的实现。如果每个目录只是一个包含某些内容的文本文件,则可能存在一种简单的方法来查看该文本文件的内容。
在 Linux 的 bash 中,不可能执行cat folder
.输出只是Is a directory
.
更新问题如何查看unix/linux文件的目录结构信息?解决了同样的问题,但它没有像来自的解决方案那样有用的解决方案米特纳。
答案1
显示文件系统 inode 详细信息的工具将是特定于文件系统的。对于ext2
, ext3
,ext4
文件系统(最常见的 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
在上面,我们首先找到目录src
( 664488
) 的索引节点,然后将其内容转储到文件中src.out
,然后使用od
.正如您所看到的,该目录中的所有文件的内容(Animation.js
等)在转储中都是可见的。
这只是一个开始 - 请参阅debugfs
手册页或help
在其中键入debugfs
以获取更多信息。
如果您使用的是ext4
,您可以在以下位置找到有关目录条目的结构和布局的更多信息:内核文档。
答案2
您可以使用您选择的编程语言,像打开文件一样打开目录,然后从生成的文件句柄中读取字节。不过,这并不能告诉您太多信息,因为只要您不知道它是如何组织的,它就只是垃圾(其中有一些可识别的字符串)。它的组织方式很大程度上是相关文件系统的实现问题。如果您想深入研究这些内容,我建议您从阅读开始man dirent.h
。这应该足以让你进一步了解你喜欢的东西。
答案3
你可以尝试一下(分区就是一个例子)。
sudo debugfs /dev/xvda1
使用 dump 将 inode 数据写入文件。
sudo dumpe2fs /dev/xvda1
男人是你的朋友,这些应该会给你一些想法。