一、强大的“*”

“*”在通配符中是最常用的一种,代表0个、一个或多个字符。在使用中有三种情况,表示三种不同的含义。

1.单独的“*”

这里指的是只有“*”出现的情况,默认为单独的一个,当然连续敲两个以上的“*”效果是一样的。具体点儿说就是“*”没有和其它字符联合起来(表示目录的“/”除外)。这种情况,通配的是该目录下的所有非隐藏内容,包括非隐藏的目录和非隐藏的文件。

看以下三条命令产生的效果:

温习一下ls命令,ls命令在没有跟目录或者文件的时候,默认的操作就是“ls .”,即对当前目录做list命令。

当操作ls *的时候,相当于ls当前目录下的所有内容,ls会自动的先列出文件,然后按照顺序显示每个目录下的内容。

即,ls *和ls dir1 file1 效果是一样的。

“*”单独出现时,最常用的不是在ls上,而是在cp、mv、rsync、rm一类的命令中。比如把dir1目录下的所有内容拷贝到dir2下,dir2下已经有内容存在。这个时候cp dir1 dir2是行不通的,删掉dir2后再执行这个命令会丢失dir2下的东西,如果dir1下内容比较多,就只能使用cp dir1/* dir2/ 这样的命令。

注意:“*”单独出现匹配目录下所有内容的用途十分广泛,用起来也很方便。但是这是个危险操作,操作时一定要“pwd”确认当前目录,或者使用绝对路径,再或者使用至少一级的可以确定目录路径的相对路径(比如rm –rf training/*就很安全,因为知道training是自己建立的;但是rm –rf conf/*就很危险,系统中有很多conf目录)。

rm –rf *;mv *;chmod *;chown *这些命令,如果执行路径不对,而且执行者是root,那么都可以造成系统崩溃。

“.*”的使用

单独的“*”表示该目录下所有内容,“.*”表示的是该目录下所有的隐藏文件和目录以及”.”,”..”。可以尝试执行 ls ~/.*

2.各种字符和“*”配合使用

出现“*”和字符在一起的情况,“*”就代表这匹配0个、一个和多个任意字符的意思,字符和“*”在一起代表0个、一个或者多个文件或目录。

比如,在一个日志目录中,目录类型有access和error两种,所有日志都以日期-时间命名,形如:

access.20120804-6.log   access.20120805-19.log  error.20120804-0.log   error.20120804-22.log  error.20120805-13.log

现在列出2012年8月4日的access日志

[root@localhost date_dir]# ls -al access.20120804*log

-rw-r--r-- 1 root root 0 Aug  9 23:16 access.20120804-0.log

-rw-r--r-- 1 root root 0 Aug  9 23:16 access.20120804-10.log

-rw-r--r-- 1 root root 0 Aug  9 23:16 access.20120804-11.log

……

也可以拷贝所有2012年的日志“cp *2012* /destination”;

或者把所有年份月份14日当天的日志列出。这个就稍微复杂,需要分析文件名称,由于小时的位置也会出现14,所以这里的通配不能简单地使用“*14*”,会列出来类似于access.20120815-14.log这样的日志。应该使用这样的匹配方法“*14-*”,以避免日期和小时上的混淆,这里使用了日期后面带有“-”的特点。

二、神奇的“[  ]”

“*”通配不是在所有的时候都好用的,比如需要8月4日10-16点的日志,如果用“*”来通配,总会少一些或者多一些文件,这个时候就用到“[  ]”。

1.匹配特定的多个字符

[acm]表示匹配“a”、“c”、“m”中的任意一个,也可以写做[a,c,m],比如,挑出以字母a,c,m开头的文件:

[root@localhost letter_dir]# ls

a.txt  c.txt  e.txt  g.txt  i.txt  k.txt  m.txt  o.txt  q.txt  s.txt  u.txt  w.txt  y.txt

b.txt  d.txt  f.txt  h.txt  j.txt  l.txt  n.txt  p.txt  r.txt  t.txt  v.txt  x.txt  z.txt

[root@localhost letter_dir]# ls [a,c,m].txt

a.txt  c.txt  m.txt

[root@localhost letter_dir]# ls [acm].txt

a.txt  c.txt  m.txt

2.匹配特定的多个数字

[035]表示匹配“0”、“3”、“5”中的任意一个,也可以写作[0,3,5],比如,挑出0时,3时,5时的日志:

[root@localhost date_dir]# ls *-[0,3,5].log

access.20120804-0.log            access.20120805-0.log        access.20120814-0.log

access.20120815-0.log            error.20120804-0.log         error.20120805-0.log

注意:这里[  ]中不能出现双位以上的数字,比如[0,15]。这种情况下shell会认为需要匹配[0,1,5]。

[root@localhost date_dir]# ls access*-[0,15].log

access.20120804-0.log  access.20120804-5.log  access.20120805-1.log  access.20120814-0.log

access.20120804-1.log  access.20120805-0.log  access.20120805-5.log  access.20120814-1.log

如果需要0点和15点的数据,只能分开执行或者使用特殊方法利用正则表达式。

3.匹配连续数字或字母的用法

连续的数字或者字母,用[2-9]和[a-z]这样的方式表示,其含义是匹配2到9中的任意一个数字和a到z中的任意一个字母。

注意:和上面提到的情况类似,这里“-”两边只能是一个字符,比如0、3、9、a等,不能是10、13这样的双位或者更多位数字。如果写成[10-23],shell会认为需要匹配“1,0-2,3”这四个数字。

像本节开头所描述那样,需要8月4日10-16点的日志:

[root@localhost date_dir]# ls *0804-1[0-6].log

access.20120804-10.log  access.20120804-12.log  access.20120804-14.log  access.20120804-16.log  error.20120804-11.log  error.20120804-13.log  error.20120804-15.log

access.20120804-11.log  access.20120804-13.log  access.20120804-15.log  error.20120804-10.log   error.20120804-12.log  error.20120804-14.log  error.20120804-16.log

三、通配符练习

应用场景1:删除2019年2到3月之前的所有日志文件

[root@localhost date_dir]# ls

2019-02-11  2019-02-13  2019-02-18  2019-02-20  2019-02-22  2019-02-24  2019-02-27  2019-03-11  2019-03-13  2019-03-15  2019-03-17  2019-03-25  2019-03-27  2019-03-29  2019-03-31  2019-02-12  2019-02-14  2019-02-19  2019-02-21  2019-02-23  2019-02-25  2019-02-28  2019-03-12  2019-03-14  2019-03-16  2019-03-18  2019-03-26  2019-03-28  2019-03-30  2019-04-09

ecbs@qhd-ecds:~/project/MecbsCaller/logs/mecbslog> rm -rf 2019-0[2,3]-*

ecbs@qhd-ecds:~/project/MecbsCaller/logs/mecbslog> ls

2019-04-09

应用场景2:删除2019年1月到3月之间日期以0-5结尾的.log日志

[root@localhost date_dir]# ls

catalina.2019-02-14.log  catalina.2019-02-15.log

catalina.2019-02-20.log  catalina.2019-02-21.log

catalina.2019-02-23.log  catalina.2019-02-25.log

catalina.2019-03-03.log  catalina.2019-03-04.log

catalina.2019-03-06.log  catalina.2019-03-07.log

catalina.2019-03-08.log  catalina.2019-03-14.log

[root@localhost date_dir]# rm catalina.*-0[1-3]-[0-3][0-5].log

catalina.2019-03-06.log  catalina.2019-03-07.log

catalina.2019-03-08.log

应用场景3:删除以manager开头且日期不以8结尾的日志。

[root@localhost date_dir]#ls -lrt manager.*

-rw-r--r-- 1 app app 0 Feb 13 17:51 manager.2019-02-13.log

-rw-r--r-- 1 app app 0 Feb 14 11:10 manager.2019-02-14.log

-rw-r--r-- 1 app app 0 Feb 25 16:04 manager.2019-02-25.log

-rw-r--r-- 1 app app 0 Mar  8 14:50 manager.2019-03-08.log

[root@localhost date_dir]# rm manager*[^8].log

[root@localhost date_dir]# ls -lrt manager.*

-rw-r--r-- 1 app app 0 Mar  8 14:50 manager.2019-03-08.log

应用场景4:复制指定目录全部内容到一个空目录

[root@localhost date_dir]# ls

bin  conf  lib  LICENSE  logs  logs2  NOTICE

[root@localhost date_dir]# cp logs logs2

cp: omitting directory `logs' #如果logs目录非空则不可以移动目录内容到其他目录

[root@localhost date_dir]# cp logs/* logs2/

[root@localhost date_dir]# cd logs2

[root@localhost date_dir]# ls -lrt

total 8596

-rw-r----- 1 ecbs ecbs  120392 Apr 10 10:54 localhost_access_log.2019-04-02.txt

-rw-r----- 1 ecbs ecbs   37600 Apr 10 10:54 localhost_access_log.2019-03-29.txt

Linux通配符应用详解的更多相关文章

  1. linux awk命令详解

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  2. Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)

    启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...

  3. Linux启动过程详解

    Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...

  4. Linux /dev目录详解和Linux系统各个目录的作用

    Linux /dev目录详解(转http://blog.csdn.net/maopig/article/details/7195048) 在linux下,/dev目录是很重要的,各种设备都在下面.下面 ...

  5. linux cat 命令详解

    linux cat 命令详解 http://linux.chinaunix.net/techdoc/system/2007/11/16/972467.shtml adb shell su //这个不一 ...

  6. 【初级】linux rm 命令详解及使用方法实战

    rm:删除命令 前言: windows中的删除命令大家都不陌生,linux中的删除命令和windows中有一个共同特点,那就是危险,前两篇linux mkdir 命令详解及使用方法实战[初级]中我们就 ...

  7. Linux netstat命令详解

    Linux netstat命令详解 一  简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多 ...

  8. Linux crontab 命令详解

    在 Linux 中,任务可以被配置在指定的时间段.指定的日期.或系统平均载量低于指定的数量时自动运行.红帽企业 Linux 预配置了对重要系统任务的运行,以便使系统能够时时被更新.譬如,被 locat ...

  9. linux grep命令详解

    linux grep命令详解 简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来 ...

随机推荐

  1. python3——模块

    今天去听一个关于创业的讲座,心疼自己在那个地方站了 一个多小时(QAQ)我是心疼自己傻呀! 手机打王者之后就没有电了,一直站在那儿! 不过最后还是结束了,以后你们也会有很多讲座的,希望学弟学妹好好听讲 ...

  2. javascript模块化编程 从入门到实战

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8& ...

  3. 一个C#程序员学习微信小程序的笔记

    客户端打开小程序的时候,就将代码包下载到本地进行解析,首先找到了根目录的 app.json ,知道了小程序的所有页面. 在这个Index页面就是我们的首页,客户端在启动的时候,将首页的代码装载进来,通 ...

  4. 关于 JavaScript 中的继承

    ES5 之前,继续是这样实现的 function Parent() { this.foo = function() { console.log('foo'); }; } Parent.prototyp ...

  5. c#批量抓取免费代理并验证有效性

    之前看到某公司的官网的文章的浏览量刷新一次网页就会增加一次,给人的感觉不太好,一个公司的官网给人如此直白的漏洞,我批量发起请求的时候发现页面打开都报错,100多人的公司的官网文章刷新一次你给我看这个, ...

  6. DevOps实践之一:基于Docker构建企业Jenkins CI平台

    基于Docker构建企业Jenkins CI平台 一.什么是CI 持续集成(Continuous integration)是一种软件开发实践,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来 ...

  7. 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析

    API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...

  8. C#动态调用泛型类、泛型方法

    在制作一个批量序列化工具时遇到了如下问题,在此记录一下,仅供参考. 主程序加载另一个程序集,将其中的所有类取出,然后对这些类分别调用泛型类或泛型方法.控制台程序解决方案如下: Main工程:提供Wor ...

  9. 结合JDK源码看设计模式——迭代器模式

    前言: Iterator翻译过来就是迭代器的意思.在前面的工厂模式中就介绍过了iterator,不过当时介绍的是方法,现在从Iterator接口的设计来看,似乎又是一种设计模式,下面我们就来讲讲迭代器 ...

  10. CSS 火焰?不在话下

    正文从下面开始. 今天的小技巧是使用纯 CSS 生成火焰,逼真一点的火焰. 嗯,长什么样子?在 CodePen 上输入关键字 CSS Fire,能找到这样的: 或者这样的: 我们希望,仅仅使用 CSS ...