Linux :使用基本知识:文件名

来源:百度文库 编辑:神马文学网 时间:2024/04/30 00:32:02
Linux 使用基本知识:文件名
[From] 红联Linux论坛:www.linux110.com/bbs
在Linux中,大小写字母是严格区分开的。例如,my-filE、my-file、my-FILE是三个不同的文件(口令也是要严格区分大小写的。同样,UNIX和C开发语言也都要严格区分大小写字母)。
文件名长度最大可以为256个字符,它通常是由字母、数字、“.”(点号)、“_”(下划线)和“-”(减号)组成的。另外还有一些字母是合法的,但 是,我们并不推荐使用它们。例如,“*”(星号)、“?”(问号)、“ ”(空格)、“$”(美元符号)、“&”和任何括号。这些字母对于Linux shell有特定的含义。
文件名中一定不能含有“/ ”,因为“/ ”在Linux的目录树中表示根目录或是路径中的分隔符(如同DOS中的“\”)。
在对一个含有特殊字符的文件操作时,应当用一对单引号将其括起来,这样shell就不会对它们进行处理了。例如,要删去一个名为my file*的文件(文件名中有空格和星号),应当写为:
$ rm ´my file*´
这里要注意的是我们使用单引号而非双引号进行引用。对某些特殊字符即使用双引号进行引用,shell还是会对其进行解释,因此双引号的功能比单引号要弱一些。
下面是对一些特殊字符的说明:
星号(*):匹配零个或多个字符;
?:匹配任何一个字符;
[abc1]:匹配任何一个在枚举集合中的字符。在该例中,该集合是a、b、c或1;
[a-z]:匹配任何一个小写字符;
[A-F]:匹配任何一个从A到F的大写字符;
[0-9]:匹配任何一个单个数字;
[a-z A-Z 0-9]:匹配任何字符(小写或大小)或任何数字。
例如,下面的命令将列出当前目录下的所有文件的文件名(除了以点号开头的文件)。
$ ls *
以点号开头的文件类似于DOS中的隐藏文件。用ls -a或ls .*命令才可以显示这些文件。这些以点号开头的文件常在用户主目录中,用做用户的配置文件。
下面的命令显示了含有点号的文件。
$ ls *.*
下面的命令显示了含有两个点号的文件。
$ ls *.*.*
Linux不具备文件扩展名的概念或者任何其它DOS文件名特性(如,Micro~1.doc)。
例如,下面的命令将显示当前目录下所有以“a”、“b”或任何大写字母开头的文件的文件名。
$ ls [abA-Z]*
***********************************************
Linux 系统区分英文字符的大小写。比如 myfile,Myfile 和 myFILE 表示的是三个不同的文件。同样,用户密码和登录名也需要区分大小写(这里沿用了 Unix 和 C 语言的命名规则)。命名目录和命名文件的规则是相同的。除非有特别的原因,否则用户创建的文件和目录名要使用小写字符。大多数的 Linux 命令也使用小写字符。
Linux 系统下的文件名长度最多可到256个字符。通常情况下,文件名的字符包括:字母、数字、“.”(点)、“_”(下划线)和“-”(连字符)。Linux 允许在文件名中使用除上述符号之外的其它符号, 但并不建议用户这样做。 有些转意字符 (即该字符被系统借用,表示某种特殊含义) 在 Linux 的 命令解释器(shell)中有特殊的含义(shell 类似于 DOS 下的命令处理器 COMMAND.COM)。这样的转意字符有:“?”(问号),“*”(星号), “ ”(空格), “$”(货币符), “&”, 扩号等等。在文件名中应尽量避免使用这些字符。文件名中可以有“ ”(空格),但建议用户用“_”(下划线)来替代。“/” 既可代表目录树的根也可作为路径名中的分隔符(类似DOS下的“\”),因此“/“不能出现在文件名中。
和 DOS 一样,“.” 和 “..”分别用来表示“当前目录”和“父目录”, 因此它们也不能作为文件名。
正如 DOS 中一样,我们不能将文件命名为 . 或者 .. (点或者双点)——它们分别代表当前目录和当前目录的父目录(上一级目录)。这跟 DOS 中是完全一致的。
下面列出了一些转意字符及其意义:
* = 用于匹配任意长度大于等于零的字符序列。以 . (点)开头的文件名除外。
? = 用于匹配任意单个字符
[abC1] = 用于匹配枚举集合中任意单个字符。比例中,集合由‘a’,‘b’,‘c’,‘1’组成。
[a-z] = 用于匹配任意小字字母
[A-F] = 用于匹配任意大写字母
[0-9] = 用于匹配任意个位数字
[a-zA-Z0-9] = 用于匹配任意字母(大小写)或者数字。
\(反斜线)也是一个特殊的字符。它屏蔽后继特殊字母的特殊含义(转意),使该字符仅取其符号所代表的字面意义。
例:下面的命令会列出当前目录中除了文件名以 . 开头的文件之外的任何文件。
ls *
与此等价的命令是 ls 或者 dir (不需要后跟 “*”)。 文件名以 . 开头的文件不被列出是因为 “.”是文件名的首字符,它并不与“*”匹配。我们可以把文件名以 . 开头的文件等价地理解成 DOS 中隐藏文件。使用ls –a (带 all 选项的 ls 命令)或者 ls .* 命令来查看这些“点”文件。“点”文件在用户的 home 目录中很常见。它们通常是用户级的配置文件。
以下命令可列出当前目录中文件名含 . 的任何文件 (文件名以点开头的除外)。
ls *.*
以下命令可列出当前目录中文件名含两个点的任何文件(文件名以点开头的除外)。
ls *.*.*
请注意 Linux 中没有与 DOS 中文件扩展名相应的概念,但是你可以使用扩展名。例如,一个文件可以命名为 my_text.txt.zip 。另有一些 DOS 中的命名特色在 Linux 中是完全找不到的(比方说Micro~1.doc )。
以下的命令会找出扩展名为“htm”后再跟任意一个字符的文件:
locate *.htm?
以下命令可列出当前目录中所有文件名以a,b或者任意大写字母开头的文件:
ls [abA-Z]*
以下命令可列出当前目录中所有文件名以a开头,以n结尾的文件:
ls a*n
命令行自动完成是一个有用的功能——使用[Tab]键可以极大的节约时间,使处理复杂的长文件名变得轻松。例如,使用自动完成的功能,可以极大的减化输入以下这个长文件名的工作。
dir Eurosong\ 2000\ Olson\ Brothers\ -\ Fly\ on\ the\ wings\ of\ love\ \(denmark\).mp3
我只要输入
dir Eu
如果没有其他文件的文件名以 Eu 开头,输入之后,系统会自动输入文件名的其余部分。
如果还有其他文件的文件名也以 Eu 开头,我们可以查看一下可能的选择(系统会列出),进一步输入文件名中的下一两个字符,从而使文件的选择唯一化,系统的自动写成功能就可以启动完成整个长文件名的输入了。文件名中的反斜线作用在于提示系统其后继的字符“空格”仅取其字面意义,即,文件名中包含的确实是空格。
文件名中的有“怪”字符怎么办?大部分问题可以通过自动完成功能解决。另外,处理文件名中含有转意字符的文件,我们可以使用成对的‘’(单引号)。由于这些特殊的转意字符被单引号引用,命令解释器不会试图去解释其特殊意义。例如,给一个名为 my file* 的文件更名(文件名中含空格和*),我们可以使用:
mv 'my file*' filename_without_weird_characters.txt
请注意我使用了一对‘’号(单引号)。使用成对的“”(双引号)引用通常没有使用‘’有效。如果你使用“”号(双引号),部份转意字符可能会被命令解释器加以解释(这就意味着它们可能被转意,而不是保持字面意义)。
跟从UNIX的传统,在 Linux上 ,创建文件时,我们可以在文件名中可以使用几乎任何字符,包括不可打印字符(控制字符)。但是这情况非常少见。如果你在遇到文件名使用了这些字符,你可能会感觉很异样。我通常会在适当的位置使用一个转意字符*对这种文件进行重命名。我会先使用 ls 命令确认我要重命名的文件的文件名,然后对这个文件进行更名(使用 mv 命令):
ls –l myfile*y.html
mv myfile*y.html myfile.html
(此例中我假定非标准字符位于字母e和y之间)
这里举一个关于在文件名中使用非常规字符的极端的例子:创建一个文件名以短横线 - 开头的文件,再等它删除。用常规的删除命令似乎没有办法(因为短横钱通常是用来引导命令选项的)。例如:
dir > -junk
以上命令将创建一个以-junk 为名的文件(跟 DOS 类似,符号 > 将 dir 命令的输出重定向到一个名为“-junk”的文件。常规的删除文件命令无法把这个文件删除。我们需要使用:
rm ./-junk
文件名前的./ 表示当前目录。在此其目的是避免文件名把的首字符 - 被命令解释器当作 rm 命令的选项引导。事实上没有必要在文件名中使用这些特殊字符。遵从传统的命名规则,不会过多地使事情复杂化。
除了使用自动完成,单引号,双引号之外,我们也可以利用\(反斜线)对文件名中包含了非常规字符的文件进行操作。反斜线的作用在于屏蔽其后继字符的特殊意义。例如,我可以使用如下命令创建一个以 *?[ 为文件名的文件:
touch \*\?\[
(touch 命令创建一个空文件。如果同名文件已存在,则改变该文件最后更新的日期/时间)。