在Linux中命名文件名时使用某些特殊字符是否正确?


18

它是正确使用某些特殊字符,如+&'.。(点)和,(逗号),基本上,在文件名中。

据我所知,您可以使用-_没有问题,但做了一些研究,我一直无法找到明确的关于其他符号; 有些人说可以,有些人说不能,有些人则说“不鼓励”使用它们(无论如何)。


您正在使用什么程序来处理这些文件。只有以特殊方式解释某些字符的程序(例如,未加引号的字符串上的外壳)才会出现问题。您的平均C程序会眨眨眼就能接走所有非NUL的内容。
Anthon 2014年

9
您所说的“正确”是什么意思?
David Richerby 2014年

在文件名中使用特殊字符的问题在于,这样做会增加某些错误代码段对文件名处理不当的机会。但是,我不认为您列出的任何字符特别有可能引起任何问题。空格会有更多问题,通常应避免。特别是,应该不惜一切代价避免EOL。

Windows对文件名中的内容有更严格的限制,因此,如果有可能需要在其中使用这些文件,则需要注意这一点。
evilsoup 2014年

Answers:


28

使用某些特殊字符是否正确,例如+,&,',.。(点)和(逗号),基本上是文件名。

是。

正确但不一定明智或方便。

您可以 在现代Unix和Linux文件系统中的文件名中使用除null以外的任何字符/

您可以使用ASCII标点符号。某些实用程序在其创建的文件名中使用停止符()和逗号。

您可以使用ASCII控制字符,但这是不可取的,因为它们不太可能被可接受地显示并且难以使用。

您可以使用外壳程序元字符,例如ASCII和号和ASCII撇号。但是,这很不方便,并且要求在构造命令时必须格外小心地引用或转义此类字符。

您可以使用多种编码使用多字节字符。由外壳程序和/或实用程序决定是否正确解释和显示非ASCII字符。建议限制自己使用流行的编码(例如UTF-8)并适当设置区域设置。

使用ASCII可打印字符时,您将遇到最少的问题,将标点符号集限制为非Shell元字符,并且不以连字符开头的名称(或终止符-除非要隐藏文件)。


23

正如其他人所述,在现代Unix / Linux系统上,文件名可以包含除\0(NUL)和/(斜杠)之外的任何字符。

除此之外,POSIX标准还为文件名定义了一个可移植的字符集:

3.278可移植文件名字符集

从中构造可移植文件名的字符集。

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 . _ -

后三个字符分别是<period>,<underscore>和<hyphen>字符。另请参见路径名

当使用选项调用GNU Coreutilspathchk实用程序进行检查时,该选项将警告空文件名(无效,但可以作为参数传递给)和以连字符()开头的文件名。-p-Ppathchk-


9

最安全的选择是,请参阅Wikipedia条目以获取任何操作系统允许的字符集。从这里可以找到。

例如,对于大多数基于unix的系统,允许的字符集为8位,保留字符为空字符(NUL,'\0')。但是,在文件名中使用特殊字符不是一个好习惯,因为在删除特殊字符时会出现问题。

例如,我可以使用一个文件名,-ramesh.txt然后尝试如下删除它。

rm -ramesh.txt
rm: invalid option -- 'a'
Try `rm ./-ramesh.txt' to remove the file `-ramesh.txt'.
Try `rm --help' for more information.
rm "-ramesh.txt"
rm: invalid option -- 'a'
Try `rm ./-ramesh.txt' to remove the file `-ramesh.txt'.
Try `rm --help' for more information.

我需要将文件删除为

rm -- "-ramesh.txt"
rm: remove regular empty file `-ramesh.txt'? y

也可以从此答案中找到更多详细信息。

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

诸如ext2,ext3之类的Linux文件系统是字符集不可知的(我认为它们或多或少地将其视为字节流-只能为空,并且/被禁止)。这意味着您可以使用UTF-8编码存储文件名。我相信要由外壳程序或其他应用程序知道使用哪种编码来正确转换文件名以进行显示或处理。

综上所述,问题不在于文件名中使用特殊字符,而在于如何处理它们。


由于这个原因(“如何处理”),我几乎只使用字母,数字,下划线和句点,以使以后的工作变得更加轻松,因为我以后决定需要使用命令行程序对文件进行处理(似乎总是至少出现一次)。
phyrfox

19
不提倡以文件名开头的文件,-而是为了精确起见:1)您绝对不需要该文件名周围的引号,2)--您可以完全按照其rm本身的含义进行操作,而不是使用特殊参数:rm ./-ramesh.txt因此,您不需要这样做完全按照您的建议。
米哈尔Politowski

@MichałPolitowski不仅您不需要引号,而且它们的作用完全为零。
ctrl-alt-delor 2014年

4

您的研究几乎是正确的。可以在文件名中使用特殊字符,但是由于这些字符具有特殊含义,因此不建议使用。Linux中的文件命名约定还描述了对文件名的其他限制,例如“文件名绝不能以连字符开头”。

在文件名中使用特殊字符执行命令行操作的简单示例

作为个人说明,我宁愿避免在文件名中使用特殊字符,因为在将这些文件用于任何处理时,它们需要特别注意。因此,从开发过程中消除了处理特殊字符的问题。


1
所以,你的建议是只使用-_.在文件名(点)?
克里斯·克莱因

@ChrisKlein,是的,尽管不是在文件名的开头。
Simply_Me 2014年

特殊含义在程序(例如您的外壳)中,而不是文件名中。几乎U上&L的所有程序不关心字符只要没有在文件名NUL。
Anthon 2014年

@Anthon,是的,我的外壳如链接中所述。
Simply_Me 2014年

2
作为个人说明,我建议开发人员将其项目的父文件夹命名为“föλde​​r\t☃”-这样,他们便会立即注意到他们是否犯了这样的文件名错误,而不是发布损坏的代码或二进制文件其他人必须解决的问题。使用它不是问题,只要它是唯一以'f'开头的代码,任何shell中的制表符补全都会输入难以键入的内容。
Peteris 2014年
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.