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


35

ls -l命令的输出产生以下结果:

在此处输入图片说明

文件权限和所有者之间的数字字段是什么?即那些1、1、1和2是什么?我检查了,--help但这并不能解释。

[编辑]我以为是目录中文件的数量,但不是。见图片。“ tempFolder”具有3个文件,但仍显示“ 2”

Answers:


33

注意:@StephaneChazelas评论后编辑

ls -l允许块之后输出的第一个数字是硬链接数

它与stat“链接”中的命令返回的值相同。

当引用文件时,此数字是文件的硬链接计数;当引用目录时,此数字是包含的目录条目的数目。

一个文件通常具有1的硬链接数,但如果硬链接是用做此改变ln命令。请参阅《 Debian参考手册》

在您的示例中,为tempFile2添加硬链接将增加其链接数:

ln -l
ln tempFile2 tempHardLink
ln -l

无论tempFile2tempHardLink将有2的链接数。

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

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

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

ls -l tempFolder
mkdir tempFolder/anotherFolder
ls -l tempFolder

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



由于它显示在权限和所有权之间,因此给人的印象非常重要,但我从未使用过。通常何时需要?
伊曼纽尔·伯格

1
不对 它是链接数,周期。对于目录,您在其父目录(就像任何文件一样)中有2个条目,在其.本身中也有该条目,另外还有一个用于其..每个子目录中的条目。
斯特凡Chazelas

@StephaneChazelas我找到的所有文档都谈到了硬链接数(例如linuxgazette.net/issue35/tag/links.html)。我也发现在AskUbuntu(askubuntu.com/questions/19510/…)中提出了类似的问题。我将检查coreutils源代码,看看是否能找到确切的答案。
达米安

2
@EmanuelBerg,当文件系统的可靠性远不如现在,并且您正在开发的文件系统上时,它ls可能花费2个字符并提供更多信息,并且没有stat(1)命令,也find(1)没有fsck,也没有符号链接,这可能更多比今天有用。不破坏作家早已从事的shell脚本,就不能改变它/dev/null; 至少从1979
。– msw

8

通常,在Unix上,文件是文件表中的某些条目。文件种类繁多:常规文件,设备,符号链接,门,管道,套接字,目录...

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

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

目录是一种特殊的文件,它为多个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"增加1

然后,该新目录被链接到"/a""/a"为其添加了一个条目),因此其链接数现在为2。如果由于"/a/b/c"目录中的".."条目而创建了目录"/a/b/c",则其链接数"/a/b"将变为3。

大多数Unices限制创建到目录的更多链接,因为它们可能会导致问题循环。当他们允许link()在目录上使用a时,通常只有超级用户才能这样做。

诸如此类的某些文件系统btrfs偏离了传统的目录结构。您会注意到,btrfs即使文件系统中的目录确实包含"."与它们本身相同的索引节点号的条目,它们在目录中的链接数也始终为1 。

通常使用链接计数为2加上子目录数的事实。例如,在:

find . -name '*.c' -print

如果.不包含子目录,但包含数百万个文件。通过检查的链接计数.find可以知道没有子目录。因此,所有find要做的就是读取目录的内容并报告结尾的条目.c(就像一个grep '\.c$'几兆字节的文件,没什么大不了的)。否则,find将必须检查每个文件的类型,以查看其中是否存在目录(导致产生许多lstat()系统调用)。当然,这种优化是行不通的btrfs(尽管在现代版本的Linux中,文件类型也存储在某些文件系统(包括btrfs)的目录条目中,并由getdents(2)用于检索条目列表的系统调用返回在目录中lstat 仍然没有必要)。


+1,很好的答案:)通过查看ls源代码,我注意到在调用stat后链接号已更新。因此,stat命令将为您提供文件或目录的链接值。
达米安

-ls -l输出许可之后,在该位置不包含任何数字是什么意思?
Shubham
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.