与“.”有什么关系?和目录中的“..”?

thi*_*ary 8 command-line

当我使用 nautilus 浏览目录时(本例中的具体示例是 /media 文件夹)我什么也没看到,但是当我ls -a在终端中输入时,它显示:

. 
.. 
Run Code Online (Sandbox Code Playgroud)

穿蓝色衣服。我知道蓝色突出显示是目录,.并且..可以象征父目录和工作目录,但为什么它们在/media文件夹中?

NZD*_*NZD 18

如果 Nautilus 不显示任何内容而ls -a只显示...,则该目录中没有任何内容。

Directory.代表当前目录,它是一种使用相对路径引用文件和目录的方式。例如./subdir1/subdir2/somefile

当您发出命令时ls,在幕后这被翻译成ls .

也是如此..,它是一种引用父目录的方式。例如../../etc/cron.d


tho*_*ter 13

这两个条目是您机器上文件系统的组成部分,并且存在于内核的低级目录列表函数返回的列表中。

正如其他人所说,..是指向父目录.的链接,是指向当前目录的链接。

一些前端(例如 nautilus)隐藏了这两个条目,因为它们在图形环境中并不是真正相关,但它们仍然存在。

它们为什么存在?

这些是为方便起见的快捷方式。它们在您的整个文件系统中实施,以确保无论您使用哪个应用程序,它们都能正常工作——它们不依赖于单个应用程序的支持。它们将在允许目录路径的任何地方工作,包括配置文件。

  • ..快捷键允许你指的是与目录的父directory/..,其祖父使用directory/../..等。

  • .快捷键允许你明确地指代当前目录,在情况下,一个应用程序需要你指定的目录(或目录)中进行搜索,并且希望在当前目录中搜索。

    例如,.可以添加到PATH环境变量中,默认允许在当前目录中搜索匹配的可执行文件。或者,如果它不存在于 中PATH,您可以使用./myscript在当前目录中运行脚本,即使PATH环境变量不会在当前目录中查找可执行文件。

它们是如何实施的

在大多数传统文件系统中,...条目在磁盘上实现为目录条目,它们与它们指向的目录共享一个inode - 也就是说,它们就像到当前和父目录的硬链接,除了它们不能被删除或修改.

在操作系统内核的帮助下,该..条目甚至可以跨挂载点工作,确保挂载点的根目录将有一个..条目实现为指向挂载所在父目录的链接。无论文件系统类型如何,都会发生这种情况 - 即使在像/proc.

...保留文件名-这是不可能创建一个实际的文件或目录,并给它...作为一个名称(尽管你可以开始使用这些字符的文件名)。

  • 在传统系统上,名称`.` 和`..` 不是虚拟的而是完全真实的。我认为事情并没有发生足够的变化,以至于它们真的是虚拟的。 (4认同)
  • 这是真的——这就是作弊发生的时候。在所有常规目录(那些不是文件系统的根目录)中,点和点-点目录条目是真实的,报告的 inode 是真实的。当您位于已挂载文件系统的根目录中时,系统会伪造点-点条目的 inode 编号作为一种特殊情况。在未挂载的文件系统上,您会发现 dot 和 dot-dot 条目都具有 inode 2(同样,在旧规则下;可能存在规则不同的现代文件系统类型,但它们具有相同的节点号)。 (4认同)
  • [你是对的](https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout),但是如果你进入一个挂载点并执行`ls -ali`,你会看到有一个`。 .` 条目可以正确显示父目录的 inode,即使它挂载在不同的文件系统中 - 这意味着即使这些条目存储在磁盘上,Linux 也会动态生成它们,因此 `..` 可以跨文件系统边界。 (2认同)

pab*_*ouk 5

存在的理由和使用...

.并且..是通常存在于每个目录中的条目。它们的含义与进程的工作目录(如 shell)无关,而是与条目所在的目录有关。

..提供目录树结构的双向链接,同时.是引用目录本身的方便名称。路径directory/.directory. 理论上可以选择一个空字符串来引用目录本身,但实际上它不是那样的:ls ''不起作用,空字符串的含义不明确,因为在 a 路径的开头它引用了根目录已经:/file1是指file1在根目录中还是file1在当前工作目录中?

正如 thomasrutter 所表明的,作为普通目录条目,您可以在路径中使用.和使用这一点很重要..。例如./-filename,可用于避免将破折号解释-为命令行选项的介绍。有效的路径directory1/../directory2与 相同./directory2与 相同directory2

为什么是...隐藏?

.以开头的文件(和目录)名称按照惯例隐藏在类 Unix 系统中,因此默认情况下大多数工具不会显示...目录。这很有用,因为我们已经知道...通常存在于每个目录中。

该命令ls -a显示所有目录条目。在 Nautilus 中,Ctrl+H打开隐藏条目的显示,但除了.并且..因为它们在图形文件管理器中通常不是很有用。对于命令行上的类似行为,您可以使用ls -A.

...真正的目录条目吗?

是的,在常用的文件系统中。(正如 Jonathan Leffler 提醒的那样)我们如何检查?

# prepare the directory
cd /tmp ; mkdir testdir1

# test 1
ls -lid testdir1 testdir1/. testdir1/..
1179767 drwxrwxr-x  2 pabouk  pabouk  4096 Nov 12 11:52 testdir1
1179767 drwxrwxr-x  2 pabouk  pabouk  4096 Nov 12 11:52 testdir1/.
1179650 drwxrwxrwt 14 root    root    4096 Nov 12 15:17 testdir1/..
Run Code Online (Sandbox Code Playgroud)

引用目录/文件本身的数据结构的 inode 编号(第一列)对于同一目录testdir1testdir1/.. 创建目录后,显示引用 inode(目录/文件)的目录条目数的链接计数(第 3 列)为 2,因为有testdir1in/tmp.in /tmp/testdir1/tmp/testdir1/..( /tmp)的 inode有 14 个链接,因为它有 12 个子目录..,每个目录包含+ 2 个条目。

# test 2
touch testdir1/tesfile1   # to have a regular file too

debugfs /dev/sda2 -R 'ls -l /tmp/testdir1' | cat
debugfs 1.42.12 (29-Aug-2014)
 1179767   40775 (2)   1000   1000    4096 12-Nov-2015 11:52 .
 1179650   41777 (2)      0      0    4096 12-Nov-2015 15:46 ..
 1179771  100664 (1)   1000   1000       0 12-Nov-2015 11:52 tesfile1
Run Code Online (Sandbox Code Playgroud)

该实用程序debugfs直接从磁盘扇区读取 ext2(和更新的)文件系统数据(绕过 Linux 内核中的文件系统)。

# test 3

debugfs /dev/sda2 -R 'dump /tmp/testdir1 '>(od -tax1)
debugfs 1.42.12 (29-Aug-2014)
0000000   w nul dc2 nul  ff nul soh stx   . nul nul nul stx nul dc2 nul
         77  00  12  00  0c  00  01  02  2e  00  00  00  02  00  12  00
0000020  ff nul stx stx   .   . nul nul   { nul dc2 nul   h  si  bs soh
         0c  00  02  02  2e  2e  00  00  7b  00  12  00  e8  0f  08  01
0000040   t   e   s   f   i   l   e   1   s   o   c   k   e   t nul nul
         74  65  73  66  69  6c  65  31  73  6f  63  6b  65  74  00  00
0000060 nul nul nul nul nul nul nul nul nul nul nul nul nul nul nul nul
         00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
*
0010000
Run Code Online (Sandbox Code Playgroud)

如果您不相信目录列表,debugfs您可以检查目录的原始转储并检查...条目是否真的存在。

  • 只是一件事:这些条目不是虚拟的,它们实际上存在于大多数 unix 文件系统中。关于 thomasrutter 对内核特殊外壳的回答的评论特别有趣。 (2认同)

Ser*_*nyy 3

简短回答:.指当前目录,..指其上方的目录,又称父目录。/media用于在驱动器上安装 USB 和分区等内容。除非您明确连接 USB 或自己安装某些东西,否则该目录将保持为空。