Operating system 为什么目录列表包含当前(.)和父(…)目录?

Operating system 为什么目录列表包含当前(.)和父(…)目录?,operating-system,filesystems,Operating System,Filesystems,每当我使用readdir之类的函数列出目录的内容时,返回的文件名还包括“.”和“.”。我怀疑这些只是文件系统中的普通链接,因此无法与实际文件区分开来,但我始终必须将它们过滤掉,因为它们不是我列出的目录中的实际对象。像readdir这样的函数包含它们是否有充分的理由?某些操作系统或文件系统是否包含更多或不同的虚拟文件名?除了用“.”和“.”进行字符串比较外,还有更好的方法过滤掉它们吗 更新:谢谢大家的回答。我想我一直认为像/和..这样的事情仅仅是可以通过搜索和替换来处理的约定。我觉得让它们成为文件

每当我使用readdir之类的函数列出目录的内容时,返回的文件名还包括“.”和“.”。我怀疑这些只是文件系统中的普通链接,因此无法与实际文件区分开来,但我始终必须将它们过滤掉,因为它们不是我列出的目录中的实际对象。像readdir这样的函数包含它们是否有充分的理由?某些操作系统或文件系统是否包含更多或不同的虚拟文件名?除了用“.”和“.”进行字符串比较外,还有更好的方法过滤掉它们吗

更新:谢谢大家的回答。我想我一直认为像/和..这样的事情仅仅是可以通过搜索和替换来处理的约定。我觉得让它们成为文件系统本身的一部分有点奇怪,尽管可能更高效、更透明


不过,还有一个问题:从那时起。和。。这些链接的名称是任意的,是否有使用不同名称的文件系统?

一个原因是,没有它们,就无法访问父目录。或者获取当前目录的句柄

没有它们,我们就不能做以下事情:

./run_this

实际上,我们无法将“.”添加到$PATH,这意味着我们永远无法执行路径中不存在的文件。

这些是普通目录,它们是指向当前目录和上面目录的“硬链接”。它们存在于所有目录中(甚至在根目录中,
完全相同)

使用
ls
时,您可以使用
ls-A
过滤掉
(注意大写字母
-A

当将命令应用于所有点文件时,而不是
,我经常使用
?*
,它只匹配名称为三个或更多字符的点文件

touch .??*
注意:此模式还排除了以点开头且只有两个字符长的任何其他文件(例如
.x
),但这些文件并不常见

当使用像
readdir()
这样的编程文件列表器时,我必须手动排除
。由于这两个文件应该是
readdir()
返回的列表中的第一个文件,因此可以执行以下操作:

@files = readdir(DIR);
for (1..2) { shift @files; } # get rid of . and ..
# go on with your business

报告它们是因为它们存储在目录列表中。Unice一直都是这样工作的。

实际上是文件系统中的硬链接。需要它们,以便您可以基于某些引用路径指定相对路径(请考虑
“./sibling/file.txt”
)。因为这些硬链接实际上存在于文件系统中,所以
readdir
告诉您它们是有意义的。(实际上,术语
硬链接
只是指一些与所引用的实际目录无法区分的名称:它们都指向文件系统中相同的
inode


最好的方法是只要
strcmp
,如果您不想列出它们,就忽略它们。

因为在类似Unix的操作系统上,目录列表命令包括这些命令,您可以使用它们在文件系统层次结构中上下移动


类似于
grep{not/^.{1,2}\z/}readdir HANDLE
的东西应该适合您。

没有充分的理由让目录扫描返回这些文件名

我怀疑这些是 只是文件系统中的普通链接 因此无法与 实际文件

是的。虽然您可能将文件系统视为包含文件夹的“文件夹”的层次结构,但它实际上是一个双链接树1,目录是节点,文件是叶子。因此,
是访问当前节点叶子和遍历树所需的链接,它们与所有其他链接是一样的

调用
readdir
时,您可以从当前节点直接访问所有位置。如果你不想列出你认为“向上”的地方,你必须自己把它们分类。您应该为此编写一个小函数,可能称为
readdir\u down
。我不知道目录是按哪个顺序列出的,但也许你可以扔掉前两个条目


1) 这是第一个近似值,也有可能是“硬链接”使树实际上成为一个网络。

最初它们是硬链接,文件系统代码中的特殊情况数量为。和。。这是最低限度的。然而,这并不适用于所有现代文件系统


但是,这些约定已经建立起来,因此即使这两个目录项实际上不存在的文件系统也仍然通过readdir之类的API报告它们的存在。现在更改此选项将破坏大量代码。

这两行应该放在函数中。您如何知道它们不在函数中?:-)奇怪的是,在Windows上,根目录(c:\,d:\,…)不包含这两个链接中的任何一个。而省略了。。有人可能会说得通,省略一下。不。比尔,请将我的评论视为“是,和…”,而不是“是,但…”。
在文件系统的根目录中是一种特殊情况,至少对于安装在其他文件系统中的文件系统是这样。例如,如果
/home
有自己的文件系统,则路径
/home/.
引用回父文件系统,即使实际目录项
与Windows上的
具有相同的inode。似乎隐式地是路径的一部分,这意味着您可以键入run\u this。习惯了这一点,我总是觉得在使用Linux时坚持使用./prefix有点烦人,尽管我理解它的安全价值。直到今年早些时候向我解释了它之前,我还没有真正想过多少安全约束。这个讨厌的用户可能会