![在 Bash 中使用时,最好避免在文件名中使用字符,例如“?”](https://linux22.com/image/85314/%E5%9C%A8%20Bash%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E6%97%B6%EF%BC%8C%E6%9C%80%E5%A5%BD%E9%81%BF%E5%85%8D%E5%9C%A8%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%AD%97%E7%AC%A6%EF%BC%8C%E4%BE%8B%E5%A6%82%E2%80%9C%3F%E2%80%9D.png)
例如:
$ ls -l total 344 -r-------- 1 t t 145657 Mar 11 01:53 joeltest-slides.pdf -rw-rw-r-- 1 t t 166814 Mar 11 01:55 The Joel Test: 12 Steps to Better Code? by Joel Spolsky.pdf drwx-w--w- 2 t t 4096 Sep 19 2012 The Joel Test 12 Steps to Better Code_files -rw--w--w- 1 t t 31940 Feb 12 2011 The Joel Test 12 Steps to Better Code.html $ mv The\ Joel\ Test\:\ 12\ Steps\ to\ Better\ Code{ \ by\ Joel\ Spolsky.pdf,.pdf} mv: missing destination file operand after ‘The Joel Test: 12 Steps to Better Code{’ Try 'mv --help' for more information.
这是什么
missing destination file operand
意思?是因为?
文件名吗?在Bash中,就通过内置或外部命令执行文件操作而言,命名文件时最好避免使用哪些字符?例如,
上面的例子是否暗示
?
是其中之一?做我之前的帖子暗示新行字符是其中之一?
从 Linux 的角度来看,文件名中可以使用的字符没有限制,这是否正确?从文件系统类型 (ext4) 的角度来看都不是吗?
答案1
一个绝对规则是不能/
在文件名中使用斜杠或空字节。斜杠是目录分隔符,不能转义。空字节表示名称的结尾并且也无法转义。除此之外,Linux 上允许使用任何字符(访问与其他文件系统共享的媒体或网络资源时除外),但多个字符可能会导致问题。我认为所有现代 *BSD 也允许除/
和 null 字节之外的任何字符,但一些较旧的 unice 有更多限制。
如果您希望文件名在通用 shell 中工作而无需引用,则需要避免!"#$&'()*;<=>?[\]^`{|}~
使用空格(空格、制表符、换行符)。~
如果在最后就可以了。具体来说,在 bash 中,^
是可以的,除了开头之外,在任何地方都是可以的,并且#
除了作为命令名称之外都是可以的(因为它会被解释为赋值)。~
=
除此之外,这里还有一些文件名可移植性建议,按重要性排序。
- 文件名不要以
-
(破折号/连字符)开头。命令可能会将其解释为选项。 - 不要使用首字母
~
(波形符),因为这在许多应用程序中表示“主目录”。 - 更一般地,不要以标点符号开始或结束,因为许多应用程序为这些符号分配了特殊含义(例如,
|foo
表示“通过程序进行管道传输foo
”而不是“写入文件|foo
”,同样用于foo|
输出)。 - 如果您要与 Windows 用户交换文件,或将文件放在可移动媒体上,请不要使用 Windows 不支持的字符:
\/?:*"><|
- 不要使用不可打印的字符(例如控制字符)、制表符或换行符。您甚至无法在许多界面中输入它们。
- 一些写得不好的 shell 脚本可能会呛在空间上以及
\*?[]
因为它们是通配符。此外,一些可以同时作用于多个文件的应用程序将这些字符解释为通配符。 - 如果您要与旧计算机或使用不同语言的人交换文件,尤其是用非拉丁字母书写的语言,他们可能会使用不同的字符编码。这ASCII码保证字符在任何地方都可用并且以相同的方式编码。
- 许多应用程序使用文件扩展名,找出他们支持哪些文件以及如何打开它们。系统还使用扩展名来确定使用哪个应用程序打开文件。因此,请将扩展保留在适当的位置。扩展名是最后一个点之后的部分,
txt
例如myfile.txt
;有时有多个扩展名,例如myfile.txt.gz
压缩 (.gz
) 文本 (.txt
) 文件。 .
以are开头的文件名默认隐藏在命令的输出ls
和许多文件浏览器中。- Unix 区分大小写:
myfile
与Myfile
.传统上,文件名都是小写的,主要是因为这样更容易输入。在过去,系统通常将大写字母排在小写字母之前,因此存在以大写字母开头的文件名的传统,以使其在目录列表中排在第一位,但现代系统通常不区分大小写地对名称进行排序。坚持使用小写可以避免混乱并且更容易打字。
如果您不想记住所有这些复杂的情况,这里有两个简单的规则:
- 最大安全性:坚持使用字母
a
和z
数字0
,9
加上-
分隔单词,并.extension
放在文件名的末尾。例如:my-file.txt
- 更具可读性:在文件名末尾使用英文或您自己的脚本中的字母和数字,加上空格或
-
分隔单词。.extension
例如:Jörgs Datei.txt
最后提示:对于日期,请使用 YYYYMMDD 格式(年-月日,年份为 4 位数字,月份和日期数字前导零),例如20150622-report.txt
。这样,对文件名进行排序就可以按时间顺序排列。