点文件,例如.htaccess
.gitignore
and .config
,是否有文件扩展名但没有文件名,或者它们是否被认为有文件名但没有扩展名?
我正在尝试在 PHP 中实现一些实用程序函数,这因做错事情而臭名昭著,我注意到 PHP 的pathinfo
函数认为 dotfiles 具有文件扩展名且没有文件名,而 nodepath.extname
认为 dotfiles 具有文件名且没有扩展名。
我不清楚是否存在标准,或者这是否符合开发人员的偏好。
点文件,例如.htaccess
.gitignore
and .config
,是否有文件扩展名但没有文件名,或者它们是否被认为有文件名但没有扩展名?
我正在尝试在 PHP 中实现一些实用程序函数,这因做错事情而臭名昭著,我注意到 PHP 的pathinfo
函数认为 dotfiles 具有文件扩展名且没有文件名,而 nodepath.extname
认为 dotfiles 具有文件名且没有扩展名。
我不清楚是否存在标准,或者这是否符合开发人员的偏好。
您付了钱,然后选择:是的,不,也许。
这取决于您对“扩展”的定义。
请记住,SCCS 文件使用前缀s.
(其中包括;您也会看到p.
文件 - 并且有许多带有其他前缀的临时文件名)。SCCS 文件是否s.something
有扩展名或前缀?(使用s.source.c
,它相当简单;有前缀、名称和扩展名或后缀,或者您可以忽略前缀作为特殊情况,名称是s.source
,扩展名是.c
。)默认的可执行文件名称a.out
呢?诸如..dot
;之类的名字怎么样?它有扩展名吗?如果有,它是什么?
请注意,DOS 上的答案更加正式。在那里,文件系统用于(在另一个千年左右)使用 8.3 强制执行名称,并且扩展是有形的。但这在很大程度上是一个过去的时代(很少有人怀念它)。
Anthony Arnold和paxdiablo都注意到以.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
程序存在以识别文件内容的原因。它查看文件的内容以识别内容;它不注意文件扩展名(因此它也不必决定扩展名是什么)。
有人想知道文件扩展名的原因是他想知道文件的类型(或其他一些元数据),对吧?
点文件的名称与其类型无关。点文件的第一个点之后的部分是它的名称,没有扩展名。但是点文件也可以有扩展名(例如.mongorc.js
,UNIX 系统上的一些其他隐藏文件)。
所以我想说,节点的path.extname
做法是正确的。
从最后一个 '.' 返回路径的扩展名 到路径最后部分的字符串结尾。如果没有'.' 在路径的最后部分或它的第一个字符是'.',然后它返回一个空字符串。
这里有两个不同的东西:
一方面存在通过文件扩展名确定某些元数据的机制,例如在非类 Unix系统中使用“默认”应用程序打开它。
另一方面,点文件只是ls
来自
类 unix系统的隐藏文件(具有正常名称和前面的点,以使它们对 不可见)。所以.gitignore
只是一个名为gitignore 并标记为隐藏的文件 - 这里没有扩展名。
我觉得我必须留下一个解决用户实际问题的答案。
在这种情况下,您实际上需要扩展什么?.gitignore
等文件与.htaccess
文件的全名匹配。不是“扩展名”(或缺少),而是全名。
我会争论取消对文件扩展名的任何检查,并检查文件名。例如,在 PHP 中:
basename ("/path/to/.htaccess");
我会说它们只是隐藏的......在 Unix/Linux 中,如果文件/目录的第一个字符是“。”,则认为文件/目录是隐藏的。(点),所以它只是第一个字符 - 不是扩展名/后缀。
此外,目录也可以被隐藏——包括“.”。和“..”(当前和父)目录 - 扩展名/后缀通常不是我们与目录相关联的东西。事实上,许多程序会为自己创建这样的隐藏目录(例如 .foo),而不仅仅是一个文件(例如 .foorc)。
最后,无论如何,Unix/Linux 从来没有那么关心后缀——大多数程序能够读取“他们的”文件而无需中继。相反,Unix 经常使用来自“magic”文件(/etc/magic)的测试和file
阻止文件类型的命令。(值得注意的例外是像gzip
and之类的压缩程序bzip2
,它用后缀压缩版本替换原始版本)。
我要补充一点,“rc”结尾(用于“运行命令”)——例如 .bashrc、.wgetrc、.zshrc 等,可以被认为是这些类型文件的后缀/扩展名——事件虽然名称和后缀之间没有点(有些 - 例如 .rtorrent.rc - 实际上有一个点)。