Linux通配符

来自tomtalk
跳转至: 导航搜索

linux文件名匹配(通配符使用)

当在使用命令行时,有很多时间都用来查找你所需要的文件,如ls find等。 S h e l l提供了一套完整的字符串模式匹配规则,或者称之为元字符,当s h e l l遇到上述字符时,就会把它们当作特殊字符,而不是文件名中的普通字符,这样用户就可以用它们来匹配相应的文件名,我理解这可以称为通配符。

通配符与正则表达式是有区别的,简单来说:通配符是用来通配的,正则表达式是用来匹配字符串的;在文本过滤工具里,都是用正则表达式,比如像awk,sed,等,是针对文件的内容的。而通配符多用在文件名上,比如查找find,ls,cp,等等。其次,shell对通配符与正则表达式的出了有不同,“ ”内一般为通配符(是shell本身提取处理),‘ ’内一般为正则表达式(shell会将其中的数据传递给其它命令处理)。

下面就是通常意义上的通配符:

  • 匹配文件名中的任何字符串,包括空字符串。

? 匹配文件名中的任何单个字符。

[...] 匹配[ ]中所包含的任何字符。

[!...] 匹配[ ]中非感叹号!之后的字符。

如:

  • 5* 5开头的所有字符串
  • *5 5结尾的所有字符串
  • *5? 以5为倒数第二个字符的字符串
  • [0-9] 所有以数字的字符
  • [1,2] 1或者2
  • [!0-9] 不是数字的字符
  • ls /etc/[!a-n]*.conf 列出/etc/目录中不是以字母a到n开头的,并且以.conf结尾的文件
  • ls /etc/[a-n]*.conf 列出/etc/目录中以字母a到n开头的,并且以.conf结尾的文件
  • ls /bin/[ck]* 列出以 c或k开头的文件名

如有不妥之处,请指正。

Linux通配符

1、基本的通配符有哪些?

·“?”可替代单个字符。

·“*”可替代任意字符。

·方括号“[charset]”可替代charset集中的任何单个字符。

对最后一条做些解释。[cChH]通配符便可替代c或h字符的大小写形式。通配符集还能描述介于字符对之间的所有字符。如“[a-z]”就可以代替任意小写字母,而[a-zA-Z]则可替代任意字母。注意可替代的字符包括字符包括字符对之间的所有字符。

与DOS相比,UNIX的通配符机制要比DOS好得多。在DOS中,任何在“*”之后,在“.”之彰的字符均被忽略,所以下面的指令将不能得到你想象的结果。

del *bak.*

在DOS中,用户只能用此命令删除当前目前下的所有文件,除非系统要求你不这样做。而在UNIX系统中,“*”可替代包括0在内的任意数字的字符,但一行中的其余特征也仍需匹配,因此“bak.*”可匹配newbak.save、oldbak.new甚至bak.temp,但不能和newbak匹配,因为后者不含“.”。这非常巧妙,可大大方便用户,而“*bak”则可匹配以上所有的词条,包括newbak。

2、能在一条指令中用多个通配符吗?

可以,如

rm a*out*tmp?

该命令可以删除一系列临时性的输出文件,如ab.out.temp1、ab.out.temp1等。

3、如何利用通配符使指令更灵活?

UNIX可将有一定关的文件看作一集合的一部分,用户可以用该集合去匹配。所以,如果你需要删除file1.temp、file2.temp……file9.temp,只须健入:

rm file[0-9].temp

该技巧的用处在于可以用删除那些相要删除的文件。如果你每天都要为一个非常重要的数据库做一个“dump”报告,你把文件存入dump.'date%h%d',它包括一系列文件如下:

dump.jun23

dump jun24

dump jun25

dump.jun26

再让我们假设因为每个文件的容量都在100M左右,所以磁盘空间很快会被占满,因此需要每隔几天删去一些老的文件,只留下最近的两个文件,为此,键入:

rm –i du*[34]

这条指令将删去那些以“du”开头并以“3”或“4”结尾的文件。