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


60

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

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

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


…在Unix,Windows和Amiga 1000上?
slhck 2011年

主要是现代Linux。
Martin Ueding

-符号是安全的在Windows 7上使用..可能是其他现代操作系统都一样..你可以用减号分开..
NIRANJAN辛格

Answers:


48

摘要:

  • 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编码存储文件名。我相信要由外壳程序或其他应用程序知道使用哪种编码来正确转换文件名以进行显示或处理。

结论

因此,您可能可以安全地使用类似的内容(如果输入起来不是那么困难)


Windows中的区分大小写

C> dir /B
Ab
aB
аB

C> type Ab
b
b

C> type aB
b
b

C> type аB
unicode homograph

请注意,我们无法键入第二个文件的内容,Windows type命令仅返回Ab的内容。第三个文件也将不同于Linux上的aB。

(Windows 10 NTFS)。


1
总而言之,这是一个很好的答案,但我避免在空格中使用文件名。在所有情况下正确地转义它们比其价值更大。请注意,Microsoft停止在系统目录名称中使用空格。如果您需要在名称中指出单词边界,则CamelCase可以正常工作。
艾萨克·拉比诺维奇

4
Win8中仍然存在“ C:\ Program files(x86)”-这不是系统目录吗?我同意空格会引起问题。
RedGrittyBrick 2012年

是的,但是几乎可以重命名为任何东西。当然,如果将其重命名为“]:\ foobar”,很多程序都会吓跑,但是Windows仍将其称为“%programfiles(x86)%”。
马克·托马斯

2
这里要牢记的一点是,Linux系统能够将大写和小写视为不同,而Windows则认为它们是相同的。
thecoshman

1
您会惊讶于有多少程序在解析时很烂。这就是为什么有没有Windows 9
艾萨克·拉宾诺维奇

46

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

一些潜在的准则:

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

这基本上使您拥有:

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

那些总是安全的,而不是恼人的使用(只要你启动文件名以字母数字):)


1
花括号([])是正则表达式的一部分,并且在shell中也具有特殊含义。但是,除了一些邪恶的案例外,它们并没有那么糟糕。
马丁·乌丁2014年

1
嗯...我想()实际上也可以这样说。
naught101

4
在zsh中,可能会以不同的方式解释的字符包括[]()^;,所以我认为正确的答案实际上可能是[0-9a-zA-Z.,_-]逗号,也可能只是因为它在文件名中很奇怪而被排除了,尽管我不认为这会导致问题。
Casey Rodarmor 2014年

是的,我将它们从最终列表中删除了
naught101'9

1
逗号可能会令人讨厌,请echo whereami > a,b,c在Win10命令提示符窗口中尝试。
RedGrittyBrick

4

你可以:

  1. #(校对者的空格符号)替换当前的下划线
  2. 从文件名下划线到“节”日期(或第二个连字符-易于键入)

Alt-1。首字母大写可以替换空格:YYMMDD-HHMM-FileName.extYYMMDD-HHMM_FileName.ext

最少的字符可清晰显示,并在Jan-Sep(&1st-9th ea mo)中自动填充零位。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.