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