句点(。)在终端命令中的文件名开头是什么意思?
在chmod -R 421 .gimp
,句点在gimp
直接位于g
之前是什么意思? 这与*
通配符类似吗?
那种情况下的点是文件名的一部分,并且在Linux / Unix上下文中隐含文件或目录的含义,你无法在文件浏览器中看到它(Nautilus,默认情况下是vanilla Ubuntu),除非你按CTRL + H.
并且,如果你只在终端中使用ls
,你将不会看到它,除非你使用-a
或-A
标志(即ls -a
或ls -A
或ls --all
或ls --almost-all
)。
但是,点( .
)在不同的上下文中有不同的含义:
- 例如,在路径(
./file
)中,它描述了您当前所在的目录,而../file
是指父目录中的文件。 - 甚至还有一个命令
.
哪些源(运行) bash脚本文件。 所以. ./file
. ./file
(介意间距)将在当前目录中获取名为file
的脚本。 - 在REGEX上下文中,点表示“任何字符”。
你的例子中的.gimp
是一个文件名,“。” 是第一个角色。
它的意义是正常的ls
(ls = list files)不会显示带有“。”的文件。 作为第一个字符,它只列出ls -a(或列表文件–all)
没有。 它是文件名的一部分。
您似乎有一个名为.gimp
的目录。
期。 (大声笑)
关于它的任何其他讨论都属于一个关于为什么人们选择某些文件名的问题。
就Linux本身而言,文件或目录名称中的前导点没有任何特别重要的意义。 但是,某些实用程序(例如ls
或Nautilus文件管理器)将此类文件名视为“隐藏”,即它们在输出中忽略它们,并且只有在您提供特定选项时才会显示它们。
实际上,这起源于技术上可以被视为错误的东西。 Rob Pike ,曾参与过UNIX团队调查的人员之一( 来源 ):
很久以前,随着Unix文件系统的设计正在制定,条目。 并且..出现了,使导航更容易。 我不确定,但我相信..在第2版重写期间进入,当文件系统变为分层时(它早期有一个非常不同的结构)。 然而,当一个类型的ls出现时,这些文件出现了,所以Ken或Dennis为程序添加了一个简单的测试。 那时它是汇编程序,但有问题的代码相当于这样的代码:
if (name[0] == '.') continue;
这个陈述比原来的要短一些,就是这样
if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue;
但是,嘿,这很简单。
结果有两件事。
首先,设定了一个不好的先例。 许多其他懒惰程序员通过进行相同的简化来引入错误。 以句点开头的实际文件在计算时通常会被跳过。
其次,更糟糕的是,创建了“隐藏”或“点”文件的想法。 结果,更多懒惰的程序员开始将文件放入每个人的主目录。 我没有在我用来键入的机器上安装所有那些东西,但是我的主目录有大约一百个点文件,我甚至不知道它们中的大多数是什么,或者它们是否仍然需要。 通过我的主目录进行的每个文件名评估都会因累积的污泥而减慢。
我很确定隐藏文件的概念是一个意想不到的后果。 这肯定是个错误。
如今,即使它们的内容根本没有被隐藏,这种方式也成了一种称它们为“隐藏”的惯例。 一个真正的隐藏或匿名文件/ 匿名inode ,将通过打开文件并保持其文件描述符打开,但将其与目录取消链接来实现,这使得数据本身只能由持有该文件的程序访问,并且它的子进程(最好在取消链接文件后分叉),因为子进程inheritance文件描述符。 实际上, 这就是bash在这里实现的方式 。
非常不同的故事是文件名本身就是一个点.
或..
,实际上有一些历史背后,我建议你阅读为什么ls命令中的当前目录被识别为链接到自己?
文件名开头的一个点将文件隐藏在公共文件管理器和常见的shell程序中。
当隐藏特殊目录时,原因是历史性的.
并且..
隐藏以句点开头的所有内容。 然后人们使用以句点开头的文件名来隐藏文件,因此它们仅与ls -a
一起ls -a
,例如,使配置文件不可见,这通常是ls输出中不需要的。
因此chmod -R 421 .gimp
的点不是命令的修饰符,而是实际目录名的一部分。