一般而言,在 Unix 和 Linux 上,应该避免在文件名中包含空格(普通文件、目录、链接、设备文件等)。
但我一直这样做。对于内部有空格的文件名,
- 在 Nautilus 中,空格字符显示为空格。
- 在 Bash 终端中,我要么使用
\
来表示空格,要么将文件名括在一对双引号内。 - 在某些应用程序的文件中(Nautilus,不确定操作系统是否也会这样做),文件名中的空格被替换为
%20
.
文件名中真的不允许有空格吗?
如何正确使用或处理文件名中的空格?
答案1
/
文件名中允许使用空格,甚至除了 和 NUL 之外的所有字符。建议不是在文件名中使用空格是因为它们可能会被不支持它们的软件误解。可以说,这样的软件是有缺陷的。但也可以说,像 shell 脚本这样的编程语言使得编写在出现带空格的文件名时崩溃的软件变得太容易了,而且这些错误往往会被忽视,因为 shell 脚本的开发人员经常不使用带空格的文件名来测试 shell 脚本。他们。
%20
文件名中不常见替换空格。这主要用于(网络)URL。尽管 URL 中的 % 编码有时确实会出现在文件名中,但通常是偶然的。
答案2
空间是正如您所观察到的,文件名中允许使用。
如果您查看“大多数 UNIX 文件系统”条目维基百科上的这张图表,你会注意到:
任何 8 位字符集都是允许的。我们也可以将 7 位 ASCII 包含在这个范围内,因为它是各种 8 位集的子集,并且始终使用 8 位字节来实现。
唯一禁止的字符是
/
和“null”。 “Null”指的是零字节,但无论如何,这些在文本数据中都是不允许的。
然而,如果您使用过 shell,您可能会意识到有些字符会带来麻烦,最重要的*
是 POSIX 通配符。
取决于你想如何定义“麻烦”,你可以其中包含空格(空格、制表符、换行符等),因为这需要使用""
.但这是不可避免的,因为空间是允许的,所以......
如何正确使用或处理文件名中的空格?
在 shell/命令行上下文中,将文件名用单引号或双引号括起来(但请注意他们不一样WRT 其他问题),或使用 转义空格\
,例如:
> foo my\ file\ with\ spaces\ in\ the\ name
答案3
原因很大程度上是历史性的 - 很久以前,文件名中不允许使用空格,因此空格被用作关键字/文件名分隔符。未来的 shell 解释器必须与旧脚本反向兼容,因此我们陷入了今天的头痛。
不需要与人类打交道的流程开发人员可以通过完全删除空格来使事情变得非常非常容易。苹果就是这样做的,/System/Library/CoreServices/的内容包含很少的空格,有空格的程序会代表用户打开,而且如果是CamelCased的话会看起来很奇怪。类似的仅限 UNIX 的路径也避免使用空格。
(有点相关的轶事:在 90 年代中期,一台 Windows 无人机说“举出一件你可以在 Mac 上做而我在 Windows 上做不到的事情”->“在文件名中使用 12 个字符。”-> 沉默。空格是也可能在这 12 个字符中)
答案4
阅读这个问题的答案,并注意这个问题是在有关 Unix 和 Linux 的论坛上提出的,在我看来,反对带空格的文件名的建议并不是真正来自 Unix 和 Linux 的问题,而是来自其他背景。
看看这些重复的问题,看看其他背景的其他人如何看待这一点:
- 在文件名中不使用空格字符存在哪些技术原因?关于超级用户
- 我应该避免在文件名中使用空格吗?关于软件工程
我发现以下是避免文件名中出现空格的原因对我有帮助:
- 将文件名放入变量时,需要正确引用它。
foo $filename
您必须写成而不是foo "$filename"
。 在某些情况下,您甚至需要将其放入原始字符串(例如String.raw
在 JavaScript 中) - 如果空格后面有数字,并且该文件是在线提供的,那么编码会使名称混乱:
image 1.jpg
->image%201.jpg
- 如果后端程序员没有正确处理 HTTP 代码(可能是因为第一个项目符号),那么当用户下载
Product list.pdf
, then 时将得到一个名称仅为Product
.