linux通配符
2014-01-23 00:18
211 查看
在您日常的 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
两种方法都能同样地起作用。既然我们谈到反斜杠扩展,那么现在是时候提一提了,为了指定文字 \,您可以
将它放入单引号中,或者也可以输入 \\(它将被扩展为 \)。
情况下,在命令行中输入许多文件通常让人感到厌烦:
$ 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
两种方法都能同样地起作用。既然我们谈到反斜杠扩展,那么现在是时候提一提了,为了指定文字 \,您可以
将它放入单引号中,或者也可以输入 \\(它将被扩展为 \)。
相关文章推荐
- 11、linux下的通配符和特殊符号
- Linux通配符摘要
- Linux Bash Shell学习(二):目录和通配符
- Linux运维学习笔记-通配符及正则表达式知识总结
- java调用linux命令 传递多个参数和通配符的问题
- 0219自学Linux_bash特性+命令学习(cut,sort,uniq,wc,tr,histroy,alias)+通配符glob
- linux中的通配符与正则表达式
- Linux通配符摘要
- linux通配符,grep和 egrep区别
- Linux通配符知识深度讲解
- Linux命令cp文件夹时添加正斜杠和通配符的各种用法总结
- Linux就该这么学--命令集合8(命令行通配符)
- 每天学一点linux:通配符
- linux:通配符和正则
- Linux基础-配置网络、集群内主机名设定、ssh登入、bash命令、通配符(元字符)
- Linux: shell常用通配符
- linux文件名通配符:* ? [:digit:]数字 [:lower:]小写字母 [:upper:]大写字母
- 夺命雷公狗---linux NO:8 linux的通配符和ll以及ls的使用方法
- linux基本操作和Shell常用通配符
- linux下的命令行通配符总结