一尘不染

文件名中不允许使用什么字符序列?

linux

经过测试,我发现linux允许文件名中的任何字符/(和和null(\0)除外)。那么我不应该以什么顺序输入文件名呢?我听说领导-可能会混淆某些命令行程序,这对我来说并不重要,但是如果其他人决定收集一堆文件并使用某些GNU程序对其进行过滤,则可能会打扰其他人。

我建议删除前导空格和尾随空格,而我计划这样做的原因仅是因为用户通常并不打算拥有前导/尾随空格。

可能会有什么问题序列,我应该考虑不允许什么序列?我还考虑为了方便起见,不允许在Windows中使用非法字符。我想我可能一开始不允许使用破折号(破折号是合法的窗口字符)


阅读 990

收藏
2020-06-03

共1个答案

一尘不染

自从您详细讨论了Linux以来,您的问题有些令人困惑,但随后在对另一个答案的评论中,您说您正在生成供人们下载的文件名,这大概意味着您绝对无法控制要使用的文件系统和操作系统。文件将存储在Linux上完全不相关。

出于此答案的目的,我将假设您的问题是错误的,并且您的评论是正确的。

当前使用的绝大多数操作系统和文件系统大致可分为三类:POSIX,Windows和MacOS。

POSIX规范对于保证在 所有
POSIX系统之间可移植的文件名是什么样子非常明确。您可以使用的字符在开放组基本规范的3.276节(便携式文件名字符集)中定义为:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789 ._-

您可以依赖的最大文件名长度在第13.23.3.5节(<limits.h>最小值)中定义为14。(相关常数是_POSIX_NAME_MAX。)

因此,文件名最长为14个字符,并且仅包含上面列出的65个字符,可以在所有POSIX兼容系统上安全使用,这可以为您提供24407335764928225040435790组合(或大约84位)。

如果您不想惹恼用户,则应增加两个限制:不要以破折号或点开头。以点开头的文件名通常被解释为“隐藏”文件,除非明确要求,否则不会显示在目录列表中。并且以短划线开头的文件名可能被许多命令解释为选项。(旁注:令人惊讶的是,有多少用户不了解rm ./-rfrm -- -rf技巧。)

这使您处于23656340818315048885345458组合(仍为84位)。

Windows为此添加了两个新的限制:文件名不能以点结尾,并且文件名不区分大小写。这样会将字符集从65个减少到39个字符(第一个字符为37个,最后一个字符为38个)。它没有增加任何长度限制,Windows可以处理14个字符。

这将可能的组合减少到17866587696996781449603(73位)。

另一个限制是Windows将最后一个点之后的所有内容都视为文件扩展名,表示文件的类型。如果要避免潜在的混乱(例如,如果生成的文件名类似于abc.mp3文本文件),则应该完全避免点。

您仍然有13090925539866773438463组合(73位)。

如果您要担心DOS,则存在其他限制:文件名由一个或两个部分(由点分隔)组成,其中两个部分都不能包含点。第一部分的最大长度为8,第二部分为3个字符。同样,第二部分通常保留以指示文件类型,仅剩下8个字符。

现在您有4347792138495个可能的文件名或41位。

好消息是,您可以使用3个字符的扩展名实际 正确地 指示文件类型,而不会破坏POSIX文件名的限制(8 + 3 + 1 = 12 <14)。

如果希望用户能够将文件刻录到以ISO9660级别1格式化的CD-R上,则必须在任何地方都禁止连字符,而不仅仅是第一个字符。现在,剩下的字符集看起来像

ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789_

即可获得3512479453921组合(41位)。

2020-06-03