2021-05-12 14:32:11
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
相關文章