ls -l 命令输出中文件权限和所有者之间的数字是多少?

ls -l 命令输出中文件权限和所有者之间的数字是多少?

命令的输出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

当第一次创建非目录文件时(使用openor creat(或bindmknod对于某些类型的文件)系统调用),它是通过提供新文件的路径来完成的(如"/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仍然没有必要)。

相关内容