ls -l
命令的输出产生以下结果:
文件权限和所有者之间的数字字段是什么?即那些1, 1, 1, 和 2 是什么?我检查了,--help
但这并不能解释它。
[编辑] 我以为是目录中的文件数,但不是。见图片。“tempFolder”有 3 个文件,但仍显示“2”
Dam*_*ien 42
注意:在@StephaneChazelas 评论后编辑
ls -l
权限块后输出的第一个数字是硬链接数。
它与stat
“链接”中的命令返回的值相同。
这个数字是文件的硬链接计数,当引用一个文件时,或者包含目录条目的数量,当引用一个目录时。
一个文件的硬链接计数通常为 1,但如果使用该ln
命令进行硬链接,则会发生变化。请参阅Debian 参考手册。
在您的示例中,为 tempFile2 添加硬链接将增加其链接数:
ln -l
ln tempFile2 tempHardLink
ln -l
Run Code Online (Sandbox Code Playgroud)
无论tempFile2和tempHardLink将有2的链接数。
如果您使用符号链接 ( ln -s tempFile2 tempSymLink
)执行相同的练习,则计数值不会增加。
一个目录将有2最低计数'.'
(链接本身),并在它的父目录中的条目。
在您的示例中,如果您想增加tempFolder的链接数,请创建一个新目录,数量会增加。
ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder
Run Code Online (Sandbox Code Playgroud)
从anotherFolder/到tempFolder/(即..
)的链接将被添加到计数中。
Sté*_*las 12
在 Unix 上,通常,文件是文件表中的某个条目。有不同种类的文件:常规文件、设备、符号链接、门、管道、套接字、目录……
inode 编号(您可以在 的输出中看到ls -i
)是该表中的索引。
现在,您不是通过inode而是通过path访问文件。甲路径是链目录条目。您会注意到我们在这里不是在谈论文件夹,而是在谈论目录。因为它就是目录(想想电话目录)。
目录是一种特殊的文件,它为许多 inode 提供名称。目录条目是从名称到 inode 的映射。
一个给定的文件(一个 inode)可以在一个目录中有多个名称(就像一个电话号码可以有多个名称一样),也可以在多个目录中有多个名称(条目)。这些被称为链接,也称为硬链接,以区别于软链接(符号链接的俚语,它是一种特殊类型的文件,是指向路径的指针)。
文件(inode)会跟踪它所拥有的链接(任何目录中的条目)的数量,因此当数量达到 0 时(当它从最后一个引用它的目录中取消链接时),它被释放。
这就是显示在ls -l
输出中的数字(链接数)。
当第一次创建非目录文件时(使用open
或creat
(或bind
或mknod
对于某些类型的文件)系统调用),它是通过提供新文件的路径(如"/a/b"
)来完成的。然后发生的是一个新文件和 inode 被分配,一个新条目被添加到与根目录中的"a"
名称相关联的"/"
目录中。这是初始链接,因此链接数为 1。
稍后可以使用link()
系统调用(ln
命令)添加更多链接。并且可以使用unlink()
系统调用(rm
命令)删除链接。
您会注意到目录类型的文件通常具有多个大于或等于 2 的链接。
现在,当您创建目录时,您正在调用mkdir()
系统调用。类似的东西mkdir("/a/b")
。然后它所做的是分配一个目录类型的新文件。在那个新目录中,它会自动创建两个条目:
"."
(点为目录)。这是与自身的链接。所以链接数现在是 1。".."
(对于目录的目录)。这是一个链接"/a"
。所以链接数"/a"
加一然后这个新目录被链接到"/a"
("/a"
为它添加了一个条目),所以它的链接数现在是 2。如果"/a/b/c"
创建了一个目录,由于 中的".."
条目"/a/b/c"
, 的链接数"/a/b"
将变为 3。
大多数 Unices 限制创建指向目录的更多链接,因为它们会导致有问题的循环。当他们确实允许link()
目录上的 a 时,通常只有超级用户可以这样做。
一些文件系统与btrfs
传统的目录结构不同。您会注意到btrfs
文件系统中目录的链接计数始终为 1,即使这些目录确实包含"."
与它们本身具有相同 inode 编号的条目。
链接计数传统上是 2 加上子目录的数量这一事实有其用处。例如,在:
find . -name '*.c' -print
Run Code Online (Sandbox Code Playgroud)
if.
不包含子目录但包含数百万个文件。通过查看 的链接数.
,find
可以知道没有子目录。所以所有find
要做的就是读取目录的内容并报告以结尾的条目.c
(就像grep '\.c$'
几兆字节的文件,没什么大不了的)。否则,find
将不得不检查每个文件的类型以查看是否有目录可以进入(导致尽可能多的lstat()
系统调用)。当然,这种优化不起作用btrfs
(尽管在现代版本的 Linux 中,文件类型也存储在某些文件系统(包括btrfs
)的目录条目中,并由getdents(2)
用于检索条目列表的系统调用返回在目录中,所以lstat
仍然没有必要)。