背景:在linux使用过程中,经常需要查找文件,对命令中的通配符pattern和正则表达式的区分不是很清楚。有必要好好研究一下。

1 扫盲

1.1 通配符和正则表达式

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

通配符与正则表达式是有区别的,简单来说:通配符是用来通配的,正则表达式是用来匹配字符串的;

在文本过滤工具里,都是用正则表达式,比如像awk,sed,等,是针对文件的内容的。

而通配符多用在文件名上,比如查找find,ls,cp,等等。

其次,shell对通配符与正则表达式的处理也有不同,“ ”内一般为通配符(是shell本身提取处理),‘ ’内一般为正则表达式(shell会将其中的数据传递给其它命令处理)。

2 通配符详细介绍

测试数据

 touch a a6.log abc.log ac.txt b c c5.txt x.log A

“*”

代表任意多个字符

例:查询以".log"结尾的文件

ll *.log

“?”

代表任意单个字符

例:只查询a、b、c

ll ?

“[]”

代表“[”和“]”之间的某一个字符,比如[0-9]可以代表0-9之间的任意一个数字,[a-zA-Z]可以代表a-z和A-Z之间的任意一个字母,字母区分大小写。

例:只查询字母文件

ll [a-zA-Z]

例:查询以“.log”结尾且“.log”前只有两个字符的文件且第二个字符是数字

ll ?[0-9].log

“^”

表示匹配结果取反的意思,注意这个通配符必须要在[]中使用

例:查询不是以“.txt”结尾的文件

ll *[^txt]*

“{}”

表示符合括号内包含的多个文件

例:查询‘.log’和“.txt”结尾的文件

ll {*.log,*.txt}

注意: “.”这个符合比较特殊,如果匹配的条件加上了该符合那么说明查询结果文件就包含带“.”的文件

例如前面的“^”的例子,如果我这样查询“ll *.[^txt]*”,那么结果就不一样了

删除操作

例如:删除a、b、c和以.txt结尾的文件

rm -f {[abc],*.txt}

当然既然可以查询当然也可以使用通配符匹配的方式进行移动文件,如果需要在存在很多文件的文件夹中移动某些类型的文件那么使用通配符匹配的效率就显而易见了;当时通配符的使用技巧不单单只有这些,有空的可以多去研究。

3 实例

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

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

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

[!...]   匹配[ ]中非感叹号!之后的字符。和^的效果一样

如:

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. Linux文件名匹配和输出重定向--2019-4-24

    1.文件名匹配 例:rm *.bak;   删除结尾是.bak的文件 rm *4*.bak; 删除名称中有“4”的.bak文件 ls *.????; 查找结尾是“.”后有四个字母的文件 2.管道 先进 ...

  2. Linux 文件名匹配

    As the shell reads each line, it "handles" any special characters. This includes variable ...

  3. linux文件名匹配

    *   匹配文件名中的任何字符串,包括空字符串. ? 匹配文件名中的任何单个字符. [...]   匹配[ ]中所包含的任何字符. [!...]   匹配[ ]中非感叹号!之后的字符. 如: s*   ...

  4. linux中的通配符、元字符、转义符

    linux中的通配符.元字符.转义符 linux中的通配符元字符转义符 shell命令的构成 通配符 元字符meta 转义符 example reference shell命令的构成 每条linux命 ...

  5. linux 正则表达式和通配符

    linux 正则表达式和通配符 通配符用于查找文件 包含三种:  * ? [] * 代表任意个任意字符 ? 代表任意一个字符 [] 代表中括号中的一个字符 正则表达式(正则是包含匹配,只要包含就可以匹 ...

  6. [转帖]Linux教程(13)- Linux中的通配符和正则表达式

    Linux教程(13)- Linux中的通配符和正则表达式 2018-08-22 06:16:44 钱婷婷 阅读数 39更多 分类专栏: Linux教程与操作 Linux教程与使用   版权声明:本文 ...

  7. 使用expect实现自动交互,shell命令行自动输入,脚本自动化,变量引用,expect spawn执行带引号命令,expect 变量为空,不生效,不能匹配通配符*,函数,数组

    背景 有需求,在允许命令或者脚本跳出交互行,需要进行内容输入,但需要人手动输入,不是很方便,此时可以通过expect来实现自动互动交互. expect是一个自动交互功能的工具,可以满足代替我们实际工作 ...

  8. Linux文件名小写的好处(转)

    说明:来自老阮的<为什么文件名要小写>的文章,其实我觉得应该说是<Linux文件名为什么要小写>会更合适些. 一.可移植性 Linux 系统是大小写敏感的,而 Windows ...

  9. linux文件名乱码时删除或改名的方式(转载)

    转自:http://www.linuxsa.cn/when-linux-file-name-topsy-turvy-deleted-or-renamed.html linux文件名乱码时删除或改名的方 ...

随机推荐

  1. vue-cli 动态绑定图片失败

    1.template 中引用图片,第一个为固定路径,第二个为动态绑定路径 eg: <img src="XXXXXX.png" alt=""> < ...

  2. mount状态下表空间情报试验

    SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> sta ...

  3. asp.net mvc2+nhibernate实体类映射问题之“尝试创建Controller类型的控制器时出错请确保控制器具有无参数公共构造函数”

    程序出了问题,解决后发现如此简单,犯的错误是如此的低级啊,特此记录! 运行程序总是在浏览器中看到一片空白,什么也没有,用application_error跟踪发现抓出一个这样的异常 然后浏览器中就是这 ...

  4. Vue.js动态组件

    动态组件: 1.定义: 几个组件放在同一个挂载点下,然后根据父组件的某个变量来决定显示哪个,或者都不显示. 2.动态切换原理: 在挂载点使用<component>标签,然后使用v-bind ...

  5. 我是SPI,我让框架更加优雅了!

    文章首发于[陈树义的博客],点击跳转到原文<我是 SPI,我让框架更加优雅了!> 自从上次小黑进入公司的架构组之后,小黑就承担起整个公司底层框架的开发工作.就在刚刚,小黑又接到一个任务:做 ...

  6. SpringBoot中使用Quartz笔记

    Quartz可以用来做什么? Quartz是一个任务调度框架,可用来做定时任务. 吧啦吧啦......... 还是直接上代码. application.properties  配置文件. * * ? ...

  7. mongodb分片集群

    第一章 1.mongodb 分片集群解释和目的 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 第二章 1. ...

  8. SpringBoot入门学习记录(一)

    最近,SpringBoot.SpringCloud.Dubbo等框架非常流行,作为Coder里的一名小学生,借着改革开放的东风,自然也是需要学习学习的,于是将学习经历记录于此,以备日后查看. 官网:h ...

  9. 记录:测试本机下使用 GPU 训练时不会导致内存溢出的最大参数数目

    本机使用的 GPU 是 GeForce 840M,2G 显存,本机内存 8G. 试验时,使用 vgg 网络,调整 vgg 网络中的参数,使得使用对应的 batch_size 时不会提示内存溢出.使用的 ...

  10. 访问kubernetes ingress-controller

    ingress-controller可以理解为一套反向代理系统,本身需要暴露端口到集群外部,以便客户端访问. 根据实际使用,给出两种暴露端口的方式,如下: 方案一 拓扑 说明 ingress-cont ...