终端命令中文件名开头的句点 (.) 是什么意思?

sta*_*tor 6 command-line hidden-files

在 中chmod -R 421 .gimp,句点直接在gin之前是什么意思gimp?这与*通配符相似吗?

Vid*_*uth 20

在这种情况下,点是文件名的一部分,在 Linux/Unix 上下文中表示文件或目录是隐藏的,您无法在文件资源管理器中看到它(Nautilus,这是 vanilla Ubuntu 的默认设置),除非您按CTRL+ H

而且,如果你只ls在终端中使用,你也不会看到它,除非你使用-aor-A标志(即ls -aorls -Als --allor ls --almost-all)。

但是,点 ( .) 在不同的上下文中具有不同的含义:

  • 例如,在路径 ( ./file) 中,它描述了您所在的当前目录,而在父目录中../file引用file
  • 甚至还有一个命令.可以获取(运行) bash 脚本文件。因此. ./file(注意间距)将file获取当前目录中命名的脚本。
  • 在 REGEX 上下文中,点表示“任何字符”。

  • 我认为通过更明确的方式可以更好地提供这个答案:在这种情况下,点 _doesn't_ 意味着什么;它只是文件名的一部分。作为旁注,Nautilus 隐藏了名称以点开头的所有文件。不过,关于如何使用 `.` 的其余信息非常有用,并且绝对应该保留。 (6认同)
  • 前导点是有意义的,但仅仅是因为它是文件名的一部分...... (2认同)

gui*_*erc 20

.gimp在你的例子中是一个文件名,“。” 是第一个字符。

它的意义是正常的ls(ls=list 文件)不会显示带有“.”的文件。作为第一个字符,它只列出 ls -a(或列出文件 --all)

  • @αғsнιη 一个目录仍然是一个文件,如果我们是迂腐的话。 (11认同)

Lig*_*bit 5

没有。它是文件名的一部分。

您似乎有一个名为.gimp.

时期。(哈哈)

关于它的任何其他讨论都属于关于为什么人们为事物选择某些文件名的问题。

  • 加入并投票只是为了那个时期的笑话。 (2认同)

Ser*_*nyy 5

就 Linux 本身而言,文件或目录名称中的前导点没有任何特殊意义。但是,某些实用程序(例如ls或 Nautilus 文件管理器)将此类文件名视为“隐藏”,即它们会在输出中忽略它们,并且仅在您提供特定选项时才会显示它们。

实际上,这起源于技术上可以被视为错误的东西。Rob Pike是 UNIX 团队的最初成员之一,他讲述了(来源):

很久以前,当 Unix 文件系统的设计正在制定时,条目 . 和 .. 出现,使导航更容易。我不确定,但我相信 .. 在版本 2 重写期间进入,当时文件系统变得分层(它早期具有非常不同的结构)。然而,当输入 ls 时,这些文件就会出现,因此 Ken 或 Dennis 向程序添加了一个简单的测试。当时是在汇编程序中,但有问题的代码相当于这样的:

    if (name[0] == '.') continue;
Run Code Online (Sandbox Code Playgroud)

这个声明比它应该的要短一点,那就是

   if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue;
Run Code Online (Sandbox Code Playgroud)

但是,嘿,这很容易。

结果有两件事。

首先,开了一个不好的先例。许多其他懒惰的程序员通过进行相同的简化来引入错误。以句点开头的实际文件通常在应该计算时被跳过。

其次,更糟糕的是,创建了“隐藏”或“点”文件的想法。结果,更多懒惰的程序员开始将文件放入每个人的主目录中。我没有在我用来输入的机器上安装那么多东西,但是我的主目录有大约一百个点文件,我什至不知道其中大部分是什么或者是否仍然需要它们. 通过我的主目录的每个文件名评估都会被这种累积的污泥减慢。

我很确定隐藏文件的概念是一个意想不到的结果。这当然是一个错误。

如今,尽管它们的内容根本没有隐藏,但这种称为“隐藏”的惯例已成为一种惯例。真正的隐藏或匿名文件/匿名 inode将通过打开文件并保持其文件描述符打开,但将其与目录断开链接来实现,这使得数据本身只能被持有该文件的程序访问,并且它的子进程(最好在取消链接后分叉),因为子进程继承了文件描述符。事实上,这就是 bash 实现 here-docs 的方式

非常不同的故事是,当文件名本身是一个点.或时..,它们实际上背后有一些历史,我建议您阅读为什么 ls 命令中的当前目录被标识为链接到自身?