LinuxBASHShell文件名匹配_第1页
LinuxBASHShell文件名匹配_第2页
LinuxBASHShell文件名匹配_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux BASH Shell 文件名匹配/输出重定向文件名匹配/输出重定向文件名匹配文件名匹配使得您不必一一写出名称,就可以指定多个文件。您将用到一些特殊的字符,称为通配符(wildcards)假设您想用rm命令删除目录下所有以字符串.bak结尾的文件。除了在rm后跟上所有文件名作为参数,您还可以用通配符*:rm *.bak*可匹配一个或多个字符。 在本例中,您告诉shell将命令rm的参数扩展到所有以*.bak结尾的文件,shell就将扩展后的参数告诉rm命令。您将看到,shell在命令执行前,就将读取并解释命令行。正是因为这个,您才可以将通配符用于shell命令的参数中。让我们更进一步

2、来认识通配符*。假定您有个目录,其中含文件124.bak、346.bak及583.bak。您想只保留文件583.bak,可以用:rm *4*.bakshell就将*4*.bak扩展成所有含4并以.bak结尾的字符串。注意到rm 4*.bak无法工作,因为这匹配的是以4开头的文件。由于目录中没有这样的文件,shell将这个模式扩展为空的字符串,故rm将返回出错信息:rm: cannot remove 4*.bak: No such file or directory如果您想保留文件346.bak,而删除124.bak和583.bak。这看起来有些难度,因为被删文件的名称除了后缀其他都不同。但幸运

3、的是,您可以用不含有来指定文件:rm *!6.bak这将被读为:除了以6.bak结尾的文件,删除其他所有以.bak结尾的文件。您必须将取反号(negation sign)与取反字符(这里是6)放到括号中,不然的话,shell会将惊叹号(exclamation mark)解释成历史记录替换的开始(the beginning of a history substitution)。取反号在本篇介绍的所有匹配模式中都有效。请注意:通配符*与取反号连用,很容易产生问题。猜猜rm *!6*.bak表示什么?这个命令将删除所有文件,甚至包括名称中包含6的文件。如果您将通配符*放到了取反号前面和后面,实际上取

4、反号将失效,因为shell将其解释为所有名称中任何位置都不含该字符 的文件“。在我们的例子里,只有文件666.bak不符合该模式。第二个通配符是问号(question mark) : ?在匹配时,一个问号只能代表一个字符。为了示范其用途,我们在上例的假设中添加两个 新文件:311.bak和some.text。现在,列出所有在点号后有四个字符的文件:ls *.?问号通配符能够有效地避免上面提到的取反号陷阱(negation trap) : rm *!4?.*将扩展成所有除了点号前倒数第二个字符为4的文件,也就是只保留文件346.bak。您可能会问,有没有其他匹配方式?到目前为止,您只看到了在指定

5、位置匹配唯一字符的方法。但其实您也可以这样:ls 13*将列出所有以字符T或3开头的文件;在我们的例子中,文件124.bak、311.bak和346.bak匹配。注意到您必须用中括号将匹配的模式括起来,否则模式只匹配以字符串13开头的文件。接下来,您将高兴地看到还可以定义匹配的范围:ls *3-8?.*将列出所有点号前倒数第二个字符落在3到8范围的文件。在我们的例子中,匹配的文件是346.bak和583.bak。引用shell的特殊字符但是,上面的那些机制存在一个缺点:shell总在命令执行前,试着进行扩展。有时候,会变得很棘手:文件名包含特殊字符。假设您在那个目录中还有一个名为!56.bak

6、的文件。下面试图进行模式匹配:rm !*rm rm: too few argumentsshell将!*解释成历史记录的替换(加入前一个命令的所有参数),而不是匹配方式。命令本身带特殊字符作参数。一些linux下的命令行工具,比如(e)grep、sed、awk、find及locate,都使用自己的正则表达式(regular expressions)0这些表达式与模式匹配看起来惊人地相似,但在某些地方又有所不同。但为了使这些特殊命令生效,shell就不能先将其当作模式匹配来解释:find . -name 1-9* -printfind: paths must precede expression

7、应该是:find . -name 1-9* -print./346.bak./124.bak./583.bak./311.bak您可以通过反斜线(back slash)来引用特殊字符,比如!、$、?或空格:ls !*!56.bak或者用(单)引号:ls !*!56.bak请注意,要看清楚引号应该放在什么位置0命令ls !*将查找名为!*的文件,这是由于通配符也在引号间,所以只能依照字面来解释。输出重定向Unix的理念是汇集许多小程序,每个东东都有特殊的专长。复杂的任务不是由大型软件完成,而是运用shell的机制,组合许多小程序共同完成。重定向就在其中发挥着重要的作用。在多个命令间重定向这要通过

8、管道(pipe),由管道符号|来标识。语法是:command1 | command2 | command3等等。这种格式您一定已经见到过了。管道经常将一个程序的输出送到more或less来阅读。ls -l | less其中,第一个命令提供目录内容,第二个则将其以翻页的方式显示。更复杂的例子如:rpm -qa | grepAx | less第一个命令给出所有已安装的RPM包,第二个则将其过滤(filter : grep),只剩下以人乂开头的包,第三个命令则将结果以翻页的方式显示。重定向至文件有时,您希望将命令的输出结果保存到文件中,或以文件内容作为命令的参数0这可以通过和 file将comman

9、d的输出保存到file中,这将覆盖file中的内容:ls dirlist将当前目录的内容保存到dirlist文件。command file将file内容作为command的输入:sort sdirlist将文件dirlist的内容送到命令sort,然后再将排序后的结果送到文件sdirlist。当然,您也可以一步到位:ls | sort sdirlist一种特殊的方式是command 2 file。这将command执行的出错信息送到file中。这个您到时候会需要另一种操作符是,这将输出添加到已存在的文件中:echo string file将string加到文件file中。这是不打开文件而完成编辑的好办法!但是,操作符都有一个重要的限制:command filel将删除filel的内容,而command filel却可以很好地工作,将加工过的filel内容加回到文件中。熟知了许多shell的机制后,您可能急着想知道如何来定制环境。在后面的两篇中,您将得到这方面的启示。在最后一篇中,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论