哪些字符在 Linux、Windows 和 OS-X 的跨平台文件名中是安全的

Mar*_*ing 80 filenames

目前,我YYMMDD-NAME+PAGE为大多数文件使用了一个名称。NAME有空格转换为下划线。

我想使用YYYY-MM-DD日期格式,但我不确定如何将它与名称分开。-如果名称以数字开头,A看起来会很奇怪。如果我使用 a _,则它与表示空格的下划线冲突。

在这里可以使用的文件名中哪些字符是相当安全的?我使用的是 Linux,但我可能会与其他人(Windows 7、Mac OS X)共享文件。

nau*_*101 70

虽然 RedGrittyBrick 的回答在技术上是正确的,但安全并不是唯一的问题:可用性也很重要。我认为更好的问题是“在文件名中使用哪些字符比较好”。

一些潜在的指导方针:

  • [0-9a-zA-Z_] - 字母数字字符和下划线总是可以使用的。
  • \/:*?"<>|并且空字节至少在一个系统上有问题,应始终避免。
  • 空格在许多系统上用作参数分隔符,因此应尽可能避免使用空格的文件名。其他空格(例如制表符)更是如此。
  • 分号 (;)用于在许多系统上分隔命令。 分号和逗号(,)用于分隔(某些版本?) windows 命令行上的命令行参数。
  • []()^ #%&!@:+={}'~[`]在许多 shell 中都具有特殊含义,并且很烦人,因此应避免使用。它们在 URL 中往往看起来很糟糕
  • 要避免的前导字符
    • 许多命令行程序使用连字符 [-]来表示特殊参数。
    • 基于 *nix 的系统使用句号 [.]作为隐藏文件和目录的前导字符。
  • 任何不在ASCII 集中的东西都可能导致较旧或更基本的系统(例如某些嵌入式系统)出现问题,应谨慎使用。

这基本上给你留下了:

[0-9a-zA-Z-._]

使用起来总是安全且不烦人的(只要您以字母数字开头的文件名):)

  • 在 zsh 中,可能有不同解释的字符包括 `[]()^;`,所以我认为正确的答案实际上可能是 `[0-9a-zA-Z.,_-]` 逗号也可能被排除在外因为在文件名中看到很奇怪,尽管我想不出会导致问题的实际情况。 (5认同)
  • 那么“$”呢? (2认同)
  • 我不认为我会在“不讨厌使用”的字符列表中包含 `.`。显然,有可能被误解为扩展等。 (2认同)

Red*_*ick 60

概括:

  • Windows:除了 ASCII 的控制字符和 \/:*?"<>|
  • Linux、OS-X:除了 null 或 /

在所有平台上,最好避免使用不可打印的字符,例如 ASCII 控制字符。

视窗

在 Windows 中,Windows 资源管理器不允许使用控制字符或\/:*?"<>|您可以使用空格。如果您使用空格,则在从命令行使用时通常需要引用文件名(但据我所知,GUI 应用程序不受影响)。Windows 文件系统(如 NTFS)显然使用文件名存储编码,但 UTF-16 是标准的。

Windows 的某些部分区分大小写,其他部分不区分大小写。在 Windows NTFS 文件系统上创建不同的文件名(如“Ab”和“ab”)很容易。这些名称是指包含不同单独内容的单独文件。但是,尽管 Windows 命令提示符很乐意使用 列出这两个文件dir,但您无法使用type. 见下文。

Linux,OS-X

/我相信在 Linux 和 OS-X 中,只有可打印的 ASCII 集是被禁止的。某些字符(如 的 shell 元字符*?!)会导致命令行出现问题,并且需要适当引用或转义文件名。

ext2、ext3 等 Linux 文件系统与字符集无关(我认为他们只是或多或少地将其视为字节流 - 只有空值并且/被禁止)。这意味着您可以以 UTF-8 编码存储文件名。我相信 shell 或其他应用程序知道使用什么编码来正确转换文件名以进行显示或处理。

结论

所以你可能可以安全地使用类似的东西?(如果它不那么难打字)


Windows 中的区分大小写

C> dir /B
Ab
aB
?B

C> type Ab
b
b

C> type aB
b
b

C> type ?B
unicode homograph
Run Code Online (Sandbox Code Playgroud)

请注意,我们不能键入第二个文件的内容,Windowstype命令只返回 Ab 的内容。第三个文件也与 Linux 上的 aB 不同。

(Windows 10 NTFS)。

  • Win8 中仍然存在“C:\Program files (x86)”——这不是系统目录吗?我同意空格会导致问题。 (4认同)
  • 总而言之,这是一个很好的答案,但我会避免在空格中使用文件名。在所有情况下正确地逃避它们比它的价值更麻烦。请注意,Microsoft 停止在系统目录名称中使用空格。如果您需要在名称中指明单词边界,CamelCase 可以很好地工作。 (3认同)
  • 在这里要真正记住的是,Linux 系统能够将大写和小写视为不同,而 Windows 认为它​​们是相同的。 (3认同)
  • 你会惊讶于有多少程序在解析方面很糟糕。这就是没有 Windows 9 的原因。 (2认同)