Linux通配符應用詳解


一、強大的“*”

“*”在通配符中是最常用的一種,代表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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM