目录(“ ls -U”使用)中文件的“目录顺序”是什么?


19

根据ls的手册页,ls -U表示:

不排序 按目录顺序列出条目。

“目录顺序”是什么意思,它是如何确定的?

以下测试(在ext3文件系统上执行)显示不是创建文件的顺序:

root@sv1010vm0007:/tmp# mkdir test
root@sv1010vm0007:/tmp# touch test/2
root@sv1010vm0007:/tmp# touch test/1
root@sv1010vm0007:/tmp# touch test/3
root@sv1010vm0007:/tmp# ls -U test
2  3  1

Answers:


14

这取决于文件系统。对于某些文件系统(其中包括ext3),目录实际上是具有众所周知格式的文件,并且在其权限或模式下设置了'd'位。在这种情况下,创建和删除文件名长度的历史很重要。内核将填写目录文件中的第一个条目,该条目具有足够的空间来容纳新文件的名称。有关更多详细信息,请参见http://e2fsprogs.sourceforge.net/ext2intro.html,该部分称为“物理描述”。

对于其中的其他文件系统(包括Reiserfs),目录实际上只是B +树中的某些条目,在文件系统中不可见,因此lsReiserfs文件系统中的目录是按词汇顺序排列的。


@Bruce:那么,这个“目录”文件的内容到底是什么?
Faheem Mitha

传统上,类似于struct dirent的东西,我在RHEL框和Slackware 11.0框的/usr/include/bits/dirent.h中找到它。这些机器都拒绝直接打开目录。我知道我曾经做过类似“ cat。> dot.as.file”之类的操作来将目录转换为常规文件,我认为上一次确定是Solaris 8。基本上,struct dirent包含一个索引节点(一个数字),一个记录长度,一个名称长度和一个字符串,我记得它们可能以ASCII-Nul终止,也可能不是。
布鲁斯·埃迪格

@布鲁斯:好的。并且此C结构设法将有关它包含的文件和子目录的所有信息都放入这些字段中?
Faheem Mitha

诸如ext2或BSD FFS或原始Unix文件系统之类的文件系统中的目录仅包含inode编号和相应文件名的列表。调用不带参数的“ ls”仅会为您提供一个文件名列表。如果执行“ ls -l”,则“ ls”本身将通过对文件名执行stat(2)系统调用来查找每个文件名,并从struct stat中获取权限,大小,“文件类型”等因此,不,目录文件不具有所有信息,而只是名称列表。
布鲁斯·埃迪格

2
ext2.sourceforge.net/2005-ols/paper-html/node3.html解释了dir_index功能对文件名和特定于文件系统的秘密进行哈希处理。如果启用了功能,则dump2efs在其文件系统功能行中包含dir_index。
Martin Dorey 2013年

3

确实,没有期望的特定顺序。操作系统和文件系统的实现方式取决于条目的顺序。此选项的目标是尽可能快地列出列表,这对于很大的目录而言可能是一个重要因素。


内核和文件系统驱动程序中有调度/缓存算法,这些算法会影响何时将确切的数据写入磁盘。这样做是为了提高性能。由于进行了这种优化,因此您无法真正确定确切的写入时间。另外,文件系统中的旧索引节点可能会被重用,因此新文件可以出现在旧文件所在的目录槽中。因此,创建顺序不是必需的“目录顺序”。
LawrenceC

@ultrasawblade:不知道为什么将它写为对我自己的回复的评论,而不是自己或其他回复。
jlliagre 2011年

@ultrasawblade:严格来说,“ [被重用的”旧索引节点”与旧目录槽的重用无关。每当旧目录条目取消链接时,都可能发生这种情况。如果它们都是硬链接,则不必导致索引节点被释放。
G-Man说'恢复莫妮卡'

2

这是条目在文件系统内部存储的顺序。随文件系统的不同而不同。例如,整体可以存储在某种平衡的树中,例如红黑树。对于具有少量条目的目录,或者为了有效地处理添加和删除,可能会有进一步的优化。


-1

目录只是另一个文件,其中列出了实际文件的元数据。“ ls -U”仅以相同顺序在目录文件中列出整个文件。

顺序由操作系统和文件系统实现确定。

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.