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

Chr*_*ein 22 filenames unix-philosophy

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

我知道您可以使用-并且_没有问题,但是在进行一些研究时,我无法找到有关其他符号的确切信息;有人说你可以,有人说你不能,还有一些人说“不鼓励”使用它们(无论这意味着什么)。

Red*_*ick 31

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

是的。

正确但不一定可取或方便。

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

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

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

您可以使用shell 元字符,例如 ASCII 与号和 ASCII 撇号。然而,这很不方便,并且需要在构建命令时特别注意引用或转义这些字符。

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

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


nyu*_*a7h 26

正如其他人所说,在现代 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 . _ -
Run Code Online (Sandbox Code Playgroud)

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

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


Ram*_*esh 8

最安全的选择是参考维基百科条目,了解任何操作系统允许的字符集。可以从这里找到。

例如,对于大多数基于 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.
Run Code Online (Sandbox Code Playgroud)

我需要删除文件,

rm -- "-ramesh.txt"
rm: remove regular empty file `-ramesh.txt'? y
Run Code Online (Sandbox Code Playgroud)

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

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

ext2、ext3 等 Linux 文件系统与字符集无关(我认为他们只是或多或少地将其视为字节流 - 只有空值并且/被禁止)。这意味着您可以以 UTF-8 编码存储文件名。我相信 shell 或其他应用程序知道使用什么编码来正确转换文件名以进行显示或处理。

总而言之,问题不在于对文件名使用特殊字符,而在于如何处理它们。

  • 不提倡以 `-` 开头的文件名,而是准确地说:1)你绝对不需要这个文件名周围的引号,2)而不是使用特殊的 `--` 参数,你可以完全按照 `rm` 本身的建议: `rm ./-ramesh.txt`,所以你不需要_需要_完全按照你的建议去做。 (20认同)

Sim*_*_Me 4

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

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

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

  • 作为个人说明,我建议开发人员将其项目的父文件夹命名为“föλde​​r\t☃”之类的名称 - 这样他们会立即注意到他们是否犯了破坏此类文件名的错误,而不是发布损坏的代码或二进制文件其他人必须解决这个问题。使用它不是问题,只要它是唯一以“f”开头的,任何 shell 中的制表符补全都会输入难以输入的内容。 (4认同)