您的问题有点令人困惑,因为您详细讨论了 Linux,但是在对另一个答案的评论中,您说您正在生成文件名供人们下载,这大概意味着您完全无法控制文件系统和文件将存储在哪个操作系统上,使 Linux 完全无关紧要。
出于此答案的目的,我将假设您的问题是错误的并且您的评论是正确的。
当今使用的绝大多数操作系统和文件系统大致分为三类:POSIX、Windows 和 MacOS。
POSIX 规范非常清楚保证在所有 POSIX 系统之间可移植的文件名是什么样的。您可以使用的字符在Section 3.276 (Portable Filename Character Set) of the Open Group Base Specification 中定义为:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789._-
您可以依赖的最大文件名长度在
Section 13.23.3.5 (<limits.h> Minimum Values) 中定义为
14。 (相关常量为
_POSIX_NAME_MAX。)
因此,最长 14 个字符且仅包含上面列出的 65 个字符的文件名可以在所有 POSIX 兼容系统上安全使用,它为您提供 24407335764928225040435790 组合(或大约 84 位)。
如果您不想惹恼您的用户,您应该再添加两个限制:不要以破折号或点开头的文件名。以点开头的文件名通常被解释为“隐藏”文件,除非明确要求,否则不会显示在目录列表中。以破折号开头的文件名可能会被许多命令解释为一个选项。 (旁注:令人惊讶的是有多少用户不知道 rm ./-rf 或 rm -- -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 p>
如果您希望您的用户能够将文件刻录到使用 ISO9660 级别 1 格式化的 CD-R 上,那么您必须禁止在任何地方使用连字符,而不仅仅是第一个字符。现在,剩下的字符集看起来像
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789_
为您提供 3512479453921 种组合(41 位)。