在文件名中不使用空格字符存在哪些技术原因?

Chr*_*Rea 78 file-management operating-systems filenames

今天我认识的一些人对我们这些倾向于不在文件名中使用空格的人表示愤怒,例如NamingThingsLikeThis.txt——尽管大多数现代操作系统都支持文件名中的空格。

是否有技术原因导致文件名没有(适当的)空格仍然很常见?如果是这样,避免或不鼓励文件名中的空格的这些技术原因是什么,它们在什么情况下是相关的?

我能想到的最明显的原因,以及为什么我通常避免使用它,是在处理此类文件时命令行上需要额外的引号。还有其他重要的技术原因吗?

Dav*_*ett 69

在命令行和脚本的许多上下文中,文件名中的空白字符可能是众所周知的皇家痛苦,在脚本中,您必须小心确保它们被正确转义,因此不要看起来像您所使用的命令的分隔符跑步。

即使您确定文件/目录/任何内容永远不会在这样的上下文中使用,也不将它们放在那里更安全。

那和旧习惯很难改掉。

  • 如果您认为空格不好,请尝试处理名称中带有换行符 (`'\n'`) 的文件。(类 Unix 系统实际上允许这样做;Windows 通常,或者至少使它变得困难。) (2认同)

小智 35

除了有关命令行和旧习惯的其他答案外,还有许多网络协议在处理包含空格的文件名时需要特别注意。

(如果您曾经尝试从网站下载“Product List.pdf”,并最终得到一个名为“Product”的文件,那么您就会被它咬住,因为另一端的程序员不知道或无法没有弄清楚 http Content-Disposition 标头的引用规则。)

  • +1。HTTP 开始。URL 中的空格(对于任何协议,不仅仅是 HTTP)应该转义为 %20 或 +。当它们没有按照应有的方式进行编码时,可能会出现混淆。对于网页,避免使用空格和下划线(“_”)通常用于替换它们的视觉原因-它们在带下划线的链接中看起来可能相同,因此有人手动复制链接或将其阅读给某人可能会得到错了。 (11认同)
  • 关于需要在 URL 中编码空格的最烦人的事情之一是某些软件最终会保持空格编码的趋势...... (5认同)

Der*_*ler 32

很多原因都是历史原因。这并不意味着它们在今天没有意义。

便携性问题

命名文件时,您可能还必须考虑其他(文件)系统将如何处理该文件名。文件名中的字符可能适合您的系统,但对于另一个系统可能是一个问题。

因此,只要您希望能够从较旧的系统轻松访问该文件的可能性很小,您就只能选择安全字符。这可能包括启动到您保留的旧恢复系统,或者担心最近的 Windows 版本仍然以某种方式基于 MS-DOS。

长度

文件系统可能会限制文件的长度。在 MS-DOS 仅限于8.3 个文件名的日子里,这种情况更为严重。因此,省略空格使您能够将更有意义的字符放入名称中。

其他几个文件系统也对其文件名长度进行了严格限制。维基百科在关于文件系统比较文章中有一个表格,供需要详细信息的人使用。

保留字符

MS-DOS 也将空格字符定义为保留字符。这是因为空格字符用于填充 FAT。此外,MS-DOS 没有在 shell 中提供转义系统。

命令行解释

我知道的大多数命令行都使用空格字符作为参数分隔符。当忽略正确转义文件名时,可能会产生可怕的后果,因为文件名的一部分可能会被解释为您想要调用的应用程序的参数。

考虑之间的区别

rm foo bar
Run Code Online (Sandbox Code Playgroud)

rm "foo bar"
Run Code Online (Sandbox Code Playgroud)

上面链接的维基百科文章甚至指出了由于缺少正确转义命令而引入的歧义:

可以通过首先禁止在文件名和目录名中嵌入空格来防止歧义(例如,用下划线“_”替换它们),或者,如果命令行解释器和将这些参数作为参数的程序支持参数,通过在引号字符之间包含嵌入空格的名称或在空格前使用转义字符,通常是反斜杠 ('\')。例如

Long path/Long program name Parameter one Parameter two ...
Run Code Online (Sandbox Code Playgroud)

不明确(“程序名称”是程序名称的一部分,还是两个参数?);然而

Long_path/Long_program_name Parameter_one Parameter_two ...,
LongPath/LongProgramName ParameterOne ParameterTwo ...,
"Long path/Long program name" "Parameter one" "Parameter two" ...
Run Code Online (Sandbox Code Playgroud)

和长\路径/长\程序\名称参数\一参数\二...

没有歧义。

统一资源定位符 (URL)

当尝试使用 URL 来描述文件的位置时,需要对空格进行转义。

出于多种原因,字符可能不安全。空格字符是不安全的,因为当 URL 被转录或排版或经受文字处理程序的处理时,重要的空格可能会消失,并且可能会引入不重要的空格。

来源:RFC1738

因此,必须用 a%20代替空格。这会降低 URL 的文件名部分的可读性,从而使人们首先避免使用它。


小智 29

空格被编码或转换为%20网络上的文件名,这可能会使管理站点的资产变得更加困难。

Image 1.pngImage%201.png令人困惑。Image001.png反而更容易使用。

这确实与命令行的转义序列属于同一类别。


Roo*_*ook 6

有时,在命令行上处理时,或使用较旧的操作系统时,或编写将在不同操作系统上编译的程序时,或当......有很多原因可能会出现问题时,空格可能会出现问题,而我不真觉得把文件写成:file-without-blanks.txtfile_without_blanks.txt 好麻烦。我更喜欢 dask,因为在处理例如带下划线的字体时,下划线有时会变得不可见。

但大多数情况下,这是老年习惯的问题。我认为没有足够的专业理由放弃。


附加说明,可能不相关,但我还是把它放在这里。用空格命名文件的人通常不会想到这一点。那些不经常知道为什么在文件名中避免使用它们是好的。
而且,我们都同意,没有什么比命名为“亲爱的先生或女士,我给您写这封信来通知您 yo.doc”的文件更糟糕的了。

不仅仅是空格 - 文件长度也很重要,恕我直言,它不应该超过 30 个字符。对于需要在旧操作系统下读取的 CD、DVD 等以及 Win 和 *nix 平台之间的记录,对于带有空格的长文件名也是一种祝福。

  • 懒人字用户... (2认同)