为什么 Windows 上的某些文件/文件夹名称前面有一个点?

Nik*_*lic 34 windows

例如,在 中My Documents,有以下文件夹:

.ssh
.subversion
Run Code Online (Sandbox Code Playgroud)

这是我不知道的某种命名约定吗?

use*_*686 95

这种命名约定来自类 Unix 操作系统(例如 Linux 或 OS X),它的意思是“隐藏”文件或目录。它可以在任何地方工作,但它的主要用途是在您的主目录中隐藏配置文件(例如,~/.cache/或者~/.plan——它们经常被称为“dotfiles”)。

在某种程度上,点文件可以被称为传统的 Unix,相当于 Windows 上的“AppData”目录。(许多 Linux 程序正在更改以遵循XDG 基本目录规范,将它们的配置~/.config/和其他数据移至~/.cache/& ~/.local/share/– 这使其与AppData\Roaming和更相似AppData\Local。)

您在 Windows 上拥有这些.ssh.subversion目录是因为您使用了一些程序(特别是OpenSSHSubversion),这些程序已被移植为使用 Windows 系统 API 而不是 POSIX API,但尚未针对其他一些 Windows 约定进行调整。

有时会有意跳过这种改编,以使在其 Windows 系统上使用类 Unix 环境(如 Cygwin)的人的生活更轻松。例如,Cygwin 安装了一组标准的类 Unix 工具,例如ls,它会忽略 Windows 的“隐藏”标志而只尊重.dotfile名称。此外,使用相同的位置(例如<home>/.ssh)可以更轻松地在 Windows 和 Linux/BSD/OSX 计算机之间同步配置。

另外:通常这些文件位于用户的主目录中,例如在 Linux 或Windows 7+ 上。它们很少被放在“文档”或“我的文档”子目录中。/home/name/.sshC:\Users\name\.ssh


正如 Rob Pike在 Google+ 上所写,这是一个偶然的功能:

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

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

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

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

但是,嘿,这很容易。

结果有两件事。

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

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

  • @grawity MS-DOS 1.0 是一个 DEC 风格的操作系统,由 Digital Research 完成并被微软收购,当时微软从事 [Unix 业务](https://en.wikipedia.org/wiki/Xenix)。MS-DOS 2.0 及更高版本添加了分层文件系统和一些 Unix 约定,包括用于“up dir”的`..`;微软实际上宣传了这些“高级 Unix 功能”。 (2认同)