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

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

在 中,前面的chmod -R 421 .gimp句号是什么意思?这与通配符类似吗?ggimp*

答案1

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

并且,如果您仅ls在终端中使用,您将看不到它,除非您使用-a-A标志(即ls -als -Als --allls --almost-all)。

然而,点(.)在不同的语境中有不同的含义:

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

答案2

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

它的意义在于普通的ls(ls=list files)不会显示以“.”为首字符的文件,它只用 ls -a (或 list files --all)列出

答案3

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

事实上,从技术上来说,这可以被认为是一个错误。罗布·派克,UNIX 团队的一位原始成员回忆道(来源):

很久以前,在设计 Unix 文件系统时,为了便于导航,出现了 . 和 .. 条目。我不确定,但我相信 .. 是在版本 2 重写期间加入的,当时文件系统变成了分层结构(早期的结构非常不同)。然而,当输入 ls 时,这些文件就会出现,因此 Ken 或 Dennis 向程序添加了一个简单的测试。当时它是​​汇编语言,但所讨论的代码相当于这样的代码:

    if (name[0] == '.') continue;

这句话比它应该的要短一点,

   if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue;

但嘿,这很容易。

由此产生了两件事。

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

其次,更糟糕的是,“隐藏”或“点”文件的概念被创造出来。结果,更多懒惰的程序员开始将文件放入每个人的主目录中。我用来输入这些内容的机器上并没有安装那么多东西,但我的主目录中有大约一百个点文件,我甚至不知道其中大多数是什么,也不知道它们是否仍然需要。通过我的主目录进行的每个文件名评估都会因这些累积的污泥而变慢。

我确信隐​​藏文件的概念是意料之外的结果。这肯定是一个错误。

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

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

答案4

文件名开头的点会在常见文件管理器和常见的 shell 程序中隐藏该文件。

原因是历史原因,当ls隐藏特殊目录时...隐藏以句点开头的所有内容。然后人们使用以句点开头的文件名来隐藏文件,因此它们仅以列出ls -a,例如使配置文件不可见,而这些文件通常不需要在 ls 输出中。

所以中的点chmod -R 421 .gimp不是命令的修饰符,而是实际目录名的一部分。

相关内容