基本上,在文件名中使用某些特殊字符(如+
、&
、'
、.
(点)和,
(逗号))是否正确?
我知道您可以毫无问题地使用-
和_
,但是经过一些研究,我无法找到有关其他符号的明确信息;有些人说可以,有些人说不能,还有一些人说“不鼓励”使用它们(无论这意味着什么)。
答案1
使用某些特殊字符是否正确,例如 +、&、'、. (点)和,(逗号)基本上在文件名中。
是的。
正确但不一定是可取或方便的。
您可以使用除 null 和 之外的任何字符/
现代 Unix 和 Linux 文件系统中的文件名内。
您可以使用ASCII 标点符号。一些公用事业公司使用停止(点) 和他们创建的文件名称中的逗号。
您可以使用ASCII 控制字符,但是这是不可取的,因为它们不太可能以可接受的方式显示并且难以使用。
您可以使用shell 元字符例如 ASCII 和符号和 ASCII 撇号。然而,这很不方便,并且要求在构造命令时特别注意引用或转义这些字符。
您可以使用多字节字符使用多种编码。由 shell 和/或实用程序正确解释和显示非 ASCII 字符。建议将自己限制为流行的编码(例如 UTF-8)并适当设置区域设置。
你将会拥有最少的问题使用 ASCII 可打印字符,将标点字符集限制为非 shell 元字符,并且名称不以连字符(或停止符 - 除非您想隐藏文件)开头。
答案2
正如其他人所说,在现代 Unix/Linux 系统上,文件名可以包含除\0
(NUL) 和/
(斜杠) 之外的任何字符。
除此之外,POSIX 标准还为文件名定义了可移植字符集:
3.282 可移植文件名字符集
构造可移植文件名的字符集。
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 . _ -
最后三个字符分别是 <句点>、<下划线> 和 <连字符> 字符。也可以看看路径名。
这pathchk
效用来自GNU Coreutils使用该选项调用时会对此进行检查-p
,并且该-P
选项将警告空文件名(无效但可以作为参数传递给pathchk
)和以连字符 ( -
) 开头的文件名。
答案3
最安全的选择是参考维基百科条目以了解任何操作系统允许的字符集。可以从以下位置找到这里。
例如,对于大多数基于 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 元字符,例如*?!
)会导致命令行出现问题,并且需要对文件名进行适当的引用或转义。Linux 文件系统(如 ext2、ext3)与字符集无关(我认为它们或多或少将其视为字节流 - 仅限空值并且
/
被禁止)。这意味着您可以以 UTF-8 编码存储文件名。我相信 shell 或其他应用程序知道使用什么编码来正确转换文件名以进行显示或处理。
总而言之,问题不在于使用文件名的特殊字符,而在于如何处理它们。
答案4
你的研究几乎是正确的。可以在文件名中使用特殊字符,但不建议这样做,因为这些字符具有特殊含义。Linux 中的文件命名约定还描述了对文件名的其他限制,例如“文件名不应以连字符开头”。
简单的例子使用文件名中的特殊字符执行命令行操作。
作为个人说明,我宁愿避免文件名中使用特殊字符,因为在使用这些文件进行任何处理时需要特别注意它们。因此,从开发过程中消除了处理特殊字符的担忧。