貨幣替換
有許多 Unix 實用工具可以對文件進行修改 。在大多數(shù)情況下,可以將經(jīng)過修改的內(nèi)容發(fā)送到標準輸出,您可以使用重定向操作符對其進行進一步的處理(使用管道“|)或捕獲其中的結(jié)果(使用 > 或 >> 操作符) 。
其他的實用工具(那些通常可以一次處理許多文件的工具)可以出于安全考慮而保留原始文件,并為修改后的內(nèi)容生成一個新的文件 。例如,您可以直接在命令行中使用 Perl 對文件進行處理 。以下命令:
$ perl -i.bak -pe 's/dollar(s?)/buck1/g' file.txt
將“dollar替換為“buck,將“dollars替換為“bucks 。perl -i 命令在原地對 file.txt 進行修改,而 perl -i.bak 則為原始文件建立一個副本,并在其名稱后面添加 .bak,以區(qū)別于新的、經(jīng)過修改的版本 。因此,如下的命令:
perl -i.bak -pe 's/dollar(s?)/buck1/g' *
將為當前目錄中每個文件創(chuàng)建一個備份 。假設(shè)有文件 file1.txt、file2.txt 和 file3.txt,那么您將得到 file1.txt.bak、file2.txt.bak 和 file3.txt.bak 。錯誤操作時常發(fā)生,所以建立備份是明智之舉 。
如果出現(xiàn)了錯誤,并且必須恢復原始文件,您只需輸入:mv file1.txt.bak file1.txt
。但是,如果有數(shù)百個文件 需要進行重命名,那又應(yīng)該怎么辦呢?當然,您并不希望輸入數(shù)百個單獨的 mv 命令 。相反,您可以輸入下面的命令:
foreach file in (*.txt)
do
mv $file.bak $file
done
它適用于一些簡單的情況,如本示例中的情況 。然而,這類任務(wù)非常常見,可以使用另一種特殊的實用工具,它能夠更快速地完成這項任務(wù) 。以下命令:
$ rename 's/.bak$//' *.bak
執(zhí)行了相同的任務(wù) 。正則表達式 s/.bak$// 將命令行中列出的每個文件名后面的 .bak 刪去,在本示例中是 * 或所有文件,并使用縮短后的名稱作為目標文件名 。
當文件名沒有什么規(guī)律時,rename 命令尤其有用 。例如,可以考慮下面這個目錄中的內(nèi)容,它看起來像一個大學一年級新生的信件集合 。
$ ls
RenT.txt bEErMoNey.txt gASmoNey.TXt
上面的 foreach 腳本無法處理這個問題,因為這些文件名毫無規(guī)律可循 。而 rename 可以輕松地對其進行處理:
$ rename 'y/A-Z/a-z/' *
正則表達式 y/A-Z/a-z/ 中的 y 操作符用于進行轉(zhuǎn)換 。轉(zhuǎn)換工作需要兩個列表:一個原始字符列表和一個替換字符列表 。如果這兩個列表大小相同,那么在這段文本中,將原始列表中第一個字符的實例替換為替換列表中的第一個字符 。換句話說,在本示例中,每個大寫“A的實例都將替換為小寫“a、“B替換為“b,依此類推 。文本中的小寫字母保持不變 。
如果您需要先對 rename 所執(zhí)行的工作進行預(yù)覽,那么可以添加 -n 選項 。這個選項可以顯示該命令所執(zhí)行的工作,但并不真正地進行這些更改:
$ rename -n 'y/A-Z/a-z/' *
RenT.txt renamed as rent.txt
bEErMoNey.txt renamed as beermoney.txt
gASmoNey.TXt renamed as gasmoney.txt
$ rename 'y/A-Z/a-z/' *
$ ls
beermoney.txt gasmoney.txt rent.txt
其中有一個缺點需要避免:在 Unix 系統(tǒng)中,文件名是區(qū)分大小寫的 。一個目錄中可能包含 Aa.Txt 和 aA.txT 。如上所述,可以編寫一條重命名規(guī)則將區(qū)分大小寫的文件名轉(zhuǎn)換為小寫文件名,這樣可能會與以前已存在的唯一的文件名發(fā)生沖突 。在這種情況下,rename 將如何操作呢?讓我們來看一下:
$ rename -n 'y/A-Z/a-z/' *
Aa.Txt renamed as aa.txt
aA.txT renamed as aa.txt
$ rename 'y/A-Z/a-z/' *
aA.txT not renamed: aa.txt already exists
$ ls
aA.txT aa.txt
如果您希望在進行重命名的過程中刪除現(xiàn)有的文件,那么可以添加 -f 標志 。在這個示例中,將得到一個名為 aa.txt 的文件 。那么哪個文件是其原始文件呢?因為 rename 按照字母順序進行處理,后面的 aA.txT 文件是現(xiàn)在的 aa.txt 。為什么要使用 -f 呢?如果兩個文件是相同的,僅僅是名稱不同,rename -f 會刪除重復的文件 。
推薦閱讀
- Unix系統(tǒng)下磁帶機配置使用攻略
- UNIX操作系統(tǒng)的二十年發(fā)展歷史
- 漫談UNIX的文件系統(tǒng)
- SCO UNIX到Linux操作系統(tǒng)的程序移植問題
- Unix系統(tǒng)命令Find的基本用法介紹
- 盜掘古墓罪判多久
- 對話 UNIX: 關(guān)于 inode
- Unix服務(wù)器共享Vista磁盤目錄
- UNIX 進程揭秘
- 對話 UNIX:第 2 部分: 做得多不如做得巧
