点文件有文件扩展名吗?

Do dotfiles have a file extension?

诸如 .htaccess .gitignore.config 之类的点文件是否具有文件扩展名而没有文件名,或者它们是否被认为具有文件名而没有扩展名?


我正在尝试在 PHP 中实现一些实用函数,它因做错事而臭名昭著,我注意到 PHP 的 pathinfo 函数认为点文件具有文件扩展名,没有文件名,而节点的 path.extname 认为点文件有文件名,没有扩展名。

我不清楚是否存在标准,或者这是否符合开发人员的偏好。

你付了钱,然后你选择:是的,不,也许。

归结为你对'extension'的定义。

  • 是"anything after the last dot in the name"吗?如果是这样,那些文件没有名字,都是扩展名。
  • 是"anything after a dot that isn't the first character in the name"吗?如果是,则这些文件没有扩展名。
  • 如果您使用其他定义,则需要相应地调整答案。

请记住,SCCS 文件使用前缀 s.(除其他外;您还会看到 p. 文件 — 并且有许多带有其他前缀的临时文件名)。 SCCS 文件 s.something 是否有扩展名或前缀? (对于 s.source.c,它相当简单;有一个前缀、一个名称和一个扩展名或后缀,或者您可以忽略前缀作为一种特殊情况,名称是 s.source,扩展名是.c.) 默认的可执行文件名 a.out 怎么样? ..dot 这样的名字怎么样?它有扩展名吗?如果有,它是什么?

请注意,DOS 上的答案更为正式。那里的文件系统用于使用 8.3 强制执行(又一个千年左右)名称,并且扩展名是有形的。但这在很大程度上是一个过去的时代(很少有人会怀念它)。

Anthony Arnold and paxdiablo 都指出存在以 .tar.gz 结尾的名称——此类文件的扩展名是什么?

如果您将 somecode-8.76.tar.gz 的扩展名视为 .gz 以外的任何其他内容,那么您就是在向 bag'o'worms 敞开心扉。包含的文件是somecode-8.76.tar;可以合理地说它本身具有 .tar 的扩展名。将整个 gzipped tar 文件的扩展名定义为 .tar.gz 会引发 "why isn't it .76.tar.gz" 的问题,也意味着您需要重新访问 SCCS 文件命名约定。将名称的 .76 部分吸收到 .76.tar.gz.76.tar 作为后缀确实使生活变得复杂。这是一个有效的问题,但 "an extension is the string from the last dot to the end of the name" 以外的任何问题确实令人担忧——或者需要解释扩展名的含义,并进入另一个通常最好避免的复杂领域。

请注意,O/S 或文件系统级别的 Unix 不关心文件的扩展名。程序可以决定他们是否关心扩展,但这取决于程序。扩展名是文件类型的指示符;它不是确定的。这就是 file 程序用于识别文件内容的原因。它查看文件的内容来识别内容;它不关注文件扩展名(因此它也不必决定扩展名是什么)。

有人想知道文件扩展名的原因是他想知道文件的类型(或其他一些元数据),对吗?

点文件的名称与其类型无关。点文件的第一个点之后的部分是它的 name 并且没有扩展名。但是点文件也可以有扩展名(例如 .mongorc.js 或 UNIX 系统上的其他一些隐藏文件)。

所以我想说,节点 path.extname 的做法是 正确的 方式。

Return the extension of the path, from the last '.' to end of string in the last portion of the path. If there is no '.' in the last portion of the path or the first character of it is '.', then it returns an empty string.


这里有两个不同的地方:

  • 一方面有一种机制可以通过 文件扩展名,例如用 "default" 打开它 非 unix-like 系统中的应用程序。

  • 另一方面,点文件只是隐藏文件(具有普通名称 和前面的一个点,使它们对来自 ls) 的人不可见 类 unix 系统。所以 .gitignore 只是一个文件 named gitignore 并标记为隐藏 - 这里没有 extension.

我觉得我必须留下一个解决用户实际问题的答案。

在这种情况下,您实际上需要扩展名做什么? .gitignore.htaccess 等文件与文件的全名匹配。不是 "extension"(或缺少),而是全名。

我认为应该取消对文件扩展名的任何检查,并检查文件名。例如,在 PHP:

basename ("/path/to/.htaccess");

我会说它们只是 隐藏...在 Unix/Linux 中,file/directory 被认为是 隐藏 如果它的第一个字符是“.” (点),所以它只是第一个字符 - 而不是 extension/suffix。

此外,还可以隐藏目录 - 包括“.”。和“..”(当前和父)目录 - extension/suffix 通常不是我们与目录相关联的东西。事实上,许多程序会为自己创建这样的隐藏目录(例如 .foo),而不仅仅是一个文件(例如 .foorc)。

最后,Unix/Linux 从来没有那么关心后缀 - 大多数程序都能够读取 "their" 文件而无需依赖一个文件。相反,Unix 经常使用来自 "magic" 文件 (/etc/magic) 的测试和 file 命令来阻止文件类型。 (值得注意的例外是像 gzipbzip2 这样的压缩程序,它们用带后缀的压缩版本替换了原始版本)。

我要补充的是 "rc" 结尾(对于 "run-command")——例如 .bashrc、.wgetrc、.zshrc 等等,可以被认为是 suffix/extension 对于这些类型的文件 - 虽然名称和后缀之间没有点(有些 - 例如 .rtorrent.rc - 实际上有一个点)。