home products tech support contact us

 Linux 技術支援    ⇒   基礎篇    進階篇    補腦篇    指令索引    中⇒ENG
版權所有, 引用請註明出處

 萬用字元

1.0 萬用字元
       〝?〞:任意的單一字元
       〝*〞:0 到 ∞ 個任一長度的字串
       〝{PATTERN 1,PATTEN 2,..,PAATER n}〞:擴展
       〝[ ]〞:字元集,指定要匹配的字元集合
       〝[ - ]〞:指定要匹配的字元範圍
       〝[^ ]或[! ]〞:反篩選
        POSIX Character(POSIX 字集)
1.1 rename 大量檔案更名


 1.0 萬用字元

萬用字元(Wildcards characters)和管線重定向是 Linux 指令的三大神通,可讓文字界面的威力由砲彈昇華為核彈,是圖形操作界面難以望其項背。

萬用字元主要的目的是在匹配檔名,萬用字元中的〝字元〞(Character)是以 ASCII code 所定義的英文字母或數字或符號稱為一個字元,例如英文字母〝A〞(ASCII=65)為一個字元。 一個以上的字元可組成一字串(String),例如〝XYZ〞為一字串。

傳統的檔名皆以 ASCII code 來編碼,所以善用萬用字元可減化檔案的操作,因 Linux shell 本身就能解讀萬用字元,故幾乎任何和檔案有關的指令皆可配合萬用字元,檔名有用到萬用字元來匹配叫〝globbing patterns〞或簡稱〝glob〞,常用的用法如下:
萬用字元雖好用,但也有其肓點時常困惑使用者,那就就遇到隱藏檔(〝.〞開頭的檔案)常會無效。舉例來說〝/tmp〞目錄內可能有許多的隱藏檔,但我想把此目錄內的檔案和目錄都清空,用 rm -fr * 郤無法把隱藏檔刪除。最主要原因為〝*〞代表任何東西,所以代表 rm -fr * 連同代表其目錄本身的〝.〞和其上層目錄的〝..〞也一起刪除,但這應不是我們期望的,所以只好放過〝.〞開頭的檔案。

當然其他指令如 ls *cp * ~/ 也會遇到類似的問題,解決辦法之一為用〝.[^.]*〞來匹配以〝.〞開頭的隱藏檔但又可排除〝.〞和〝..〞,如 rm -fr .[^.]* 表示刪除工作目錄中所有的隱藏檔。

另外非常不建議用很奇怪的檔名,如檔案開頭為〝-〞或檔名中有〝#、@、%、\、?、|、{、}〞等奇怪的字元,因有可能會讓萬用字元失效(試過許多的 Linux 發行版都有此 issue)或很不容易篩選和匹配所要的檔案,我們來實驗一下吧!

實驗:
$ echo > abc ←製造一長度為三個字元的檔案
$ ls ??? ←驗證一下
abc
$ echo > -12 ←製造一檔案〝-12〞(長度也為三個字元)
$ ls ??? ←再驗證一下
ls: invalid option -- 2 ←??? 失效了
Try `ls --help' for more information.
$ ls * ←列出所有檔案
ls: invalid option -- 2 ←靈異事件 ? 萬用字元全失效
$ rm -f ./-12 ←把這靈異檔案殺掉吧
$ ls ??? ←再驗證一下
abc ←正常了 :-)


   1.1 rename 大量檔案更名
rename
用法很另類主要是對付一堆的檔案,而語法也特立獨行,一定要有萬用字元的樣板。

其語法為 rename OLD_NAME  NEW_NANE  PATTERN ,其中 PATTERN 為萬用字元的樣板,只要符合萬用字元的樣板就用 NEW_NANE 取代 OLD_NAME。

用實例來操作就很容易明白用法。例如我在基隆拍了 50 張的照片,但相機的預設檔名是 IMAGE0001.jpg ~ IMAGE0050.jpg ,但這種傻瓜檔名時間一久我就忘了是在那拍的照片,所以想把全部檔名改為拍攝地點的 keelung0001.jpg ~ keelung0050.jpg 。而用 mv 指令或用 Windows 的 GUI 一一改檔名操作,保證會操作到抽筋,用 rename 就方便多了。

例:(假設工作目錄內已有 IMAGE0001.jpg~IMAGE0050.jpg 共 50 個檔案)
$ rename IMAGE keelung IMAGE* ←把檔案 IMAGE0001.jpg ~ IMAGE0050.jpg 全改檔名為
keelung0001.jpg ~ keelung0050.jpg


例:(續上例,工作目錄內已有 IMAGE0001~IMAGE0050 共 50 個檔案)
$ rename IMAGE00 keelung00 IMAGE00[0-2]?.* ←把檔案 IMAGE0001.jpg ~IMAGE0029.jpg
全改檔名為 keelung0001.jpg~keelung0029.jpg,其餘不改

例:
$ rename .config .cfg *.config ←把所有工作目錄中,副檔名為〝.config〞改為〝.cfg〞
$ rename - _ *-* ←把所有檔案中檔名中的減號〝-〞改為底線〝_〞

不只是檔案, rename 也可用在大量更名目錄,其實頂好用的!
例:(假設家目錄內已有目錄 catlog00~catlog99,共 100 個目錄)
$ rename ~/catlog ~/list ~/catlog?? ←把家目錄內的目錄 catlog00~catlog99 全改目錄名為 list00~list99

當然只要高興,用牛刀殺雞也沒什麼不可,rename 也可用來重新更名單一檔案。

例:
$ rename abc wxyz * ←把〝abc〞更名為〝wxyz〞


^ back on top ^






[註]可用 LANG= 來設定語系,如下例:
$ LANG= ←清除所有設定的語系(同等〝LANG=C〞或〝LANG=POSIX〞為清除所有設定的語系)
$ LANG=en_US.UTF-8 ←設定語系為〝en_US.UTF-8〞