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

KMC*_*KMC 45 ls

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)

无论tempFile2tempHardLink将有2的链接数。

如果您使用符号链接 ( ln -s tempFile2 tempSymLink)执行相同的练习,则计数值不会增加。

一个目录将有2最低计数'.'(链接本身),并在它的父目录中的条目。

在您的示例中,如果您想增加tempFolder的链接数,请创建一个新目录,数量会增加。

ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder
Run Code Online (Sandbox Code Playgroud)

anotherFolder/tempFolder/(即..)的链接将被添加到计数中。

  • 请参阅:http://unix.stackexchange.com/questions/31073/how-to-find-all-the-links-to-a-directory/31074#31074 (3认同)
  • @EmanuelBerg 当文件系统*远不如现在*可靠并且您正在开发您开发的文件系统时,`ls` 可以花费 2 个字符并为您提供更多信息,并且没有 `stat(1)`命令、`find(1)`、`fsck` 和符号链接都可能比现在有用得多。如果不将编写者早已过去的 shell 脚本分解为 `/dev/null`,就无法更改它;至少从 1979 年开始就是这样。 (3认同)

Sté*_*las 12

在 Unix 上,通常,文件是文件表中的某个条目。有不同种类的文件:常规文件、设备、符号链接、门、管道、套接字、目录……

inode 编号(您可以在 的输出中看到ls -i)是该表中的索引。

现在,您不是通过inode而是通过path访问文件。甲路径是链目录条目。您会注意到我们在这里不是在谈论文件夹,而是在谈论目录。因为它就是目录(想想电话目录)。

目录是一种特殊的文件,它为许多 inode 提供名称。目录条目是从名称到 inode 的映射。

一个给定的文件(一个 inode)可以在一个目录中有多个名称(就像一个电话号码可以有多个名称一样),也可以在多个目录中有多个名称(条目)。这些被称为链接,也称为硬链接,以区别于软链接符号链接的俚语它是一种特殊类型的文件,是指向路径的指针)。

文件(inode)会跟踪它所拥有的链接(任何目录中的条目)的数量,因此当数量达到 0 时(当它从最后一个引用它的目录中取消链接时),它被释放。

这就是显示在ls -l输出中的数字(链接数)。

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