1.4 命名时不要使用的特殊字符
当为文件和目录命名时,每种操作系统都会有一些禁止使用的字符。例如,在Mac OS中不允许使用冒号(:
);而Windows中则不能使用反斜杠字符(\
)。Linux中也有一些禁止使用的字符。但是在介绍这些字符之前,我们先来看看哪些字符总能安全使用:数字、字母(大写字母或小写字母)、圆点(.
)以及下划线(_
)。键盘上的有些其他字符也可以正常使用;有些虽然能够使用,但实际情况则比较复杂,因为shell对它们的解释方法可能各不相同;而还有一些则根本不能使用。
“/
”字符就永远不能使用,因为它是用于分隔目录和文件的特殊字符。假设你想用一个文件来列出需要购买的图书,而且想方设法地将文件命名为books/to_buy.txt(带“/
”),以便将它与books/on_loan.txt和books/lost.txt区别开。现在当你想引用位于/home/scott/documents/books/to_buy.txt的这一文件时,命令就不能正常运行,因为shell会以为documents目录中有个books目录,但实际上这个目录是不存在的。
可以用下划线来代替斜线(如books_to_buy),或者将单词都挤在一起(例如booksToBuy.txt或BooksToBuy.txt)。
可以使用连字符(“-
”),写成books-to-buy.txt这样。但是我觉得下划线要更好些,因为分隔单词时下划线没有连字符那么碍眼。不过,如果要使用连字符,不要把它放在文件名的开始(例如-books_to_buy.txt),也不要把它放在空格的后面(例如books - to buy)。稍后可以看到,当使用命令时,可能会调用该命令的特殊选项,而在选项前面就需要加上连字符。第2章会介绍用rm命令删除文件,但是如果你输入的是rm -books_to_buy.txt,shell将显示以下的错误信息:
rm: invalid option -- b
如果你愿意,也可以在文件名中使用空格,如books to buy.txt,但是必须得让shell知道这些空格是文件名的一部分。shell通常是将空格作为参数之间的分隔符。试图直接删除books to buy.txt会让shell产生误解,它尝试先删除名为books的文件,然后删除名为to的文件,最后删除名为buy.txt的文件。最终的结果是你不能删除books to buy.txt这个文件,反而可能无意间删除那些原本不想删除的文件。
那么如何处理文件名中的空格呢?还有“*
”和“?
”这些下一节要学习使用的字符呢?还有“'
”和“"
”字符,它们在shell中有特殊的含义,能直接在文件名中使用吗?你可以有多种选择。如果可能的话,尽量不要使用这些字符。或者在这些字符前面加个“\
”字符来对它们进行转义,这样就告诉shell:应该忽略这些字符的特殊用法,将它们作为简单字符来对待。然而,转义字符也很麻烦,一定要确保在任何时候都将“\
”字符放到正确的位置上。
$ rm Why\ don\ 't\ I\ name\ files\ with\ \*\?.txt
嗯!还有个更简单的方法,麻烦也少点,就是用引号把文件名括起来,功能类似于“\
”:
$ rm "Why don't I name files with *?.txt"
这种方法可行,但总是必须使用引号仍旧很痛苦。更好的选择就是根本不使用这些字符。表1-1列出了一些特殊字符以及它们的用法。 表1-1 在文件名中如何使用特殊字符
字 符 | 建 议 |
---|---|
/ | 绝对不能使用。不能被转义 |
\ | 必须转义。避免使用 |
- | 不能作为文件名或目录名的开始 |
[ ] | 必须转义。避免使用 |
{ } | 必须转义。避免使用 |
* | 必须转义。避免使用 |
? | 必须转义。避免使用 |
' | 必须转义。避免使用 |
" | 必须转义。避免使用 |