打印
[STM32MP1]

Linux通配符详解

[复制链接]
748|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
skyred|  楼主 | 2022-3-7 15:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、强大的“*”
“*”在通配符中是最常用的一种,代表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
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

使用特权

评论回复
沙发
foxsbig| | 2022-3-9 11:37 | 只看该作者
小星星好像用的挺多了

使用特权

评论回复
板凳
Candic12e| | 2022-3-15 13:53 | 只看该作者
Linux属实是改变科技的一种语言

使用特权

评论回复
地板
Annie556| | 2022-3-15 14:09 | 只看该作者
Linux挺好用的,基本指令记得住就可以了,其他的都可以查文档的

使用特权

评论回复
5
Allison8859| | 2022-3-15 14:20 | 只看该作者
我就好奇,那群人怎么记得住linux那么多命令的啊

使用特权

评论回复
6
Charlene沙| | 2022-3-15 14:50 | 只看该作者
其实入门linux和入门MCU差不多,但是入了MCU再来linux就有些费劲了

使用特权

评论回复
7
Betty1299| | 2022-3-15 15:32 | 只看该作者
感谢分享,这种都是经验,可以快速开发的经验啊

使用特权

评论回复
8
Emily999| | 2022-3-15 15:54 | 只看该作者
不错的,linux我用过一阵儿,属实挺难上手的

使用特权

评论回复
9
B1lanche| | 2022-3-15 16:08 | 只看该作者
正常来说linux命令也不需要记得,用help指令都能有提示的

使用特权

评论回复
10
七毛钱| | 2022-3-15 16:19 | 只看该作者
不错的,很好的开发经验

使用特权

评论回复
11
Carina卡| | 2022-3-15 16:35 | 只看该作者
用久了,命令就熟记于心了,很正常的

使用特权

评论回复
12
Betty996| | 2022-3-15 16:54 | 只看该作者
挺好的,有这个详解很有意义

使用特权

评论回复
13
Belle1257| | 2022-3-15 17:14 | 只看该作者
一般来说,都是看着例程去敲命令,熟悉了,理解了之后再自己记着敲

使用特权

评论回复
14
skyred|  楼主 | 2022-3-16 09:27 | 只看该作者
Belle1257 发表于 2022-3-15 17:14
一般来说,都是看着例程去敲命令,熟悉了,理解了之后再自己记着敲

大部分人都这样

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

740

帖子

3

粉丝