本文转自:http://blog.chinaunix.net/uid-26980210-id-3212962.html
在您日常的 Linux
使用中,有很多时候您可能需要一次对多个文件系统对象执行单一操作(比如 rm)。在这些
情况下,在命令行中输入许多文件通常让人感到厌烦:
$ rm file1 file2 file3
file4 file5 file6 file7 file8
为了解决这个问题,您可以利用 Linux
内置的通配符支持。这种支持也叫做“globbing”(由于历史原因),
允许您通过使用通配符模式一次指定多个文件。Bash
和其它 Linux 命令将通过在磁盘上查找并找到任何与之
匹配的文件来解释这种模式。因此,如果在当前工作目录中,您有从 file1
到 file8 的文件,那么您可以输入下
面的命令来删除这些文件:
$ rm
file[1-8]
或者,如果您只想要删除文件名以 file
开头的所有文件,您可以输入:
$ rm file*
或者,如果您想要列出 /etc 中以 g
开头的所有文件系统对象,您可以输入:
$ ls -d
/etc/g*
/etc/gconf /etc/ggi
/etc/gimp /etc/gnome /etc/gnome-vfs-mime-magic /etc/gpm /etc/group
/etc/group-
现在,如果您指定了没有任何文件系统对象与之匹配的模式,会怎么样呢?在下面的示例中,我们试图列出
/usr/bin 中以 asdf 开头并且以
jkl 结尾的所有文件:
$ ls -d
/usr/bin/asdf*jkl
ls: /usr/bin/asdf*jkl: No
such file or directory
这里是对所发生情况的说明。通常,当我们指定一种模式时,该模式与底层系统上的一个或多个文件匹配,
bash
以空格隔开的所有匹配对象的列表来替换该模式。但是,当模式不能找到匹配对象时,bash 将不理会参
数、通配符等等,保留原样。因此,当“ls”不能找到文件
/usr/bin/asdf*jkl 时,它会报错。此处的有效的规则
是:glob
模式只在与文件系统中的对象匹配时才可以进行扩展。
既然我们理解了 globbing
如何工作,我们来复习一下通配符语法。您可以使用几个用于通配符扩展的专门的字
符;这里有一个:
*
*
将与零个或多个字符匹配。这就是说“什么都可以”。例子:
/etc/g* 与 /etc 中以 g
开头的所有文件匹配。
/tmp/my*1 与 /tmp 中以 my
开头,并且以 1 结尾的所有文件匹配。
?
与任何单个字符匹配。例子:
myfile? 与文件名为 myfile
后跟单个字符的任何文件匹配。
/tmp/notes?txt 将与
/tmp/notes.txt 和 /tmp/notes_txt 都匹配,如果它们存在。
[]
该通配符与 ?
相似,但允许指定得更确切。要使用该通配符,把您想要匹配的所有字符放在 [] 内。结果的表达
式将与 [] 中任一字符相匹配。您也可以用 -
来指定范围,甚至还可以组合范围。例子:
myfile[12] 将与 myfile1 和
myfile2 匹配。只要当前目录中至少有一个这样的文件存在,该通配符就可以进行扩
展。
[Cc]hange[Ll]og 将与
Changelog、ChangeLog、changeLog 以及 changelog 匹配。您可以看到,与大写形式
的变形匹配时,使用括弧通配符很有用。
ls /etc/[0-9]* 将列出 /etc
中以数字开头的所有文件。
ls /tmp/[A-Za-z]* 将列出
/tmp 中以大写字母或小写字母开头的所有文件。
[!]
除了不与括弧中的任何字符匹配外,[!] 构造与
[] 构造类似,只要不是列在 [! 和 ] 之间的字符,它将与任何字符
匹配。例子:
rm myfile[!9] 将删除除
myfile9 之外的名为 myfile 加一个字符的所有文件。
这里有一些使用通配符时应该注意的告诫说明。由于
bash 对与通配符相关的字符(?、[、]、*)进行特别处理
,因此您将包含这些字符的参数输入到命令中时,需要特别小心。例如,如果您想要创建一个包含字符串
[fo]*
的文件,下面这个命令可能不会执行您想要做的事:
$ echo [fo]* >
/tmp/mynewfile.txt
如果 [fo]*
这个模式与当前工作目录中的任何文件匹配,那么您将在 /tmp/mynewfile.txt 内发现那些文件的名称
,而不是您所期望的文字
[fo]*。解决方法是什么呢?嗯,一种方法是用单引号把这些字符括起来,这将告诉
bash
单纯地执行,而不会对其进行通配符扩展:
$ echo ‘[fo]*‘ >
/tmp/mynewfile.txt
采用这种方法,您的新文件将包含所期望的文字的
[fo]*。另一种方法是,您可以使用反斜杠,告诉 bash [、]
和 *
应该被当成文字处理,而不是被当成通配符处理:
$ echo \[fo\]\* >
/tmp/mynewfile.txt
两种方法都能同样地起作用。既然我们谈到反斜杠扩展,那么现在是时候提一提了,为了指定文字
\,您可以
将它放入单引号中,或者也可以输入
\\(它将被扩展为 \)。
(转)Linux通配符,古老的榕树,5-wow.com