40

点文件,例如.htaccess .gitignoreand .config,是否有文件扩展名但没有文件名,或者它们是否被认为有文件名但没有扩展名?


我正在尝试在 PHP 中实现一些实用程序函数,这因做错事情而臭名昭著,我注意到 PHP 的pathinfo函数认为 dotfiles 具有文件扩展名且没有文件名,而 nodepath.extname认为 dotfiles 具有文件名且没有扩展名。

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

4

4 回答 4

20

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

这取决于您对“扩展”的定义。

  • 是“名称中最后一个点之后的任何内容”吗?如果是这样,这些文件没有名称并且都是扩展名。
  • 是“点之后不是名称中第一个字符的任何内容”吗?如果是这样,这些文件没有扩展名。
  • 如果您使用其他定义,则需要相应调整答案。

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

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

Anthony Arnoldpaxdiablo都注意到以.tar.gz存在结尾的名称——这些文件的扩展名是什么?

如果您将 的扩展名somecode-8.76.tar.gz视为 以外的任何内容.gz,那么您就是在向 bag'o'worms 敞开自己的大门。包含的文件是somecode-8.76.tar;可以合理地说它本身具有 的扩展.tar。将整个 gzip 压缩的 tar 文件的扩展名定义为.tar.gz引发了“为什么不是.76.tar.gz”的问题,也意味着您需要重新访问 SCCS 文件命名约定。.76将名称的一部分吸收到其中之一.76.tar.gz.76.tar作为后缀确实使生活变得复杂。这是一个有效的问题,但除了“扩展是从最后一个点到名称末尾的字符串”之外的任何问题确实令人担忧——或者需要解释扩展的含义,

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

于 2015-08-24T03:07:19.223 回答
7

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

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

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

从最后一个 '.' 返回路径的扩展名 到路径最后部分的字符串结尾。如果没有'.' 在路径的最后部分或它的第一个字符是'.',然后它返回一个空字符串。


这里有两个不同的东西:

  • 一方面存在通过文件扩展名确定某些元数据的机制,例如在非类 Unix系统中使用“默认”应用程序打开它。

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

于 2015-08-24T03:27:26.737 回答
3

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

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

我会争论取消对文件扩展名的任何检查,并检查文件名。例如,在 PHP 中:

basename ("/path/to/.htaccess");
于 2015-08-24T03:34:08.700 回答
3

我会说它们只是隐藏的......在 Unix/Linux 中,如果文件/目录的第一个字符是“。”,则认为文件/目录是隐藏的。(点),所以它只是第一个字符 - 不是扩展名/后缀。

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

最后,无论如何,Unix/Linux 从来没有那么关心后缀——大多数程序能够读取“他们的”文件而无需中继。相反,Unix 经常使用来自“magic”文件(/etc/magic)的测试和file阻止文件类型的命令。(值得注意的例外是像gzipand之类的压缩程序bzip2,它用后缀压缩版本替换原始版本)。

我要补充一点,“rc”结尾(用于“运行命令”)——例如 .bashrc、.wgetrc、.zshrc 等,可以被认为是这些类型文件的后缀/扩展名——事件虽然名称和后缀之间没有点(有些 - 例如 .rtorrent.rc - 实际上有一个点)。

于 2015-08-24T11:59:00.903 回答