首頁 > 軟體

Linux萬用字元詳解

2020-06-16 16:37:28

一、強大的“*”

“*”在萬用字元中是最常用的一種,代表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


IT145.com E-mail:sddin#qq.com