LinuxBASHShell文件名匹配_第1頁
LinuxBASHShell文件名匹配_第2頁
LinuxBASHShell文件名匹配_第3頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Linux BASH Shell 文件名匹配/輸出重定向文件名匹配/輸出重定向文件名匹配文件名匹配使得您不必一一寫出名稱,就可以指定多個文件。您將用到一些特殊的字符,稱為通配符(wildcards)假設您想用rm命令刪除目錄下所有以字符串.bak結尾的文件。除了在rm后跟上所有文件名作為參數(shù),您還可以用通配符*:rm *.bak*可匹配一個或多個字符。 在本例中,您告訴shell將命令rm的參數(shù)擴展到所有以*.bak結尾的文件,shell就將擴展后的參數(shù)告訴rm命令。您將看到,shell在命令執(zhí)行前,就將讀取并解釋命令行。正是因為這個,您才可以將通配符用于shell命令的參數(shù)中。讓我們更進一步

2、來認識通配符*。假定您有個目錄,其中含文件124.bak、346.bak及583.bak。您想只保留文件583.bak,可以用:rm *4*.bakshell就將*4*.bak擴展成所有含4并以.bak結尾的字符串。注意到rm 4*.bak無法工作,因為這匹配的是以4開頭的文件。由于目錄中沒有這樣的文件,shell將這個模式擴展為空的字符串,故rm將返回出錯信息:rm: cannot remove 4*.bak: No such file or directory如果您想保留文件346.bak,而刪除124.bak和583.bak。這看起來有些難度,因為被刪文件的名稱除了后綴其他都不同。但幸運

3、的是,您可以用不含有來指定文件:rm *!6.bak這將被讀為:除了以6.bak結尾的文件,刪除其他所有以.bak結尾的文件。您必須將取反號(negation sign)與取反字符(這里是6)放到括號中,不然的話,shell會將驚嘆號(exclamation mark)解釋成歷史記錄替換的開始(the beginning of a history substitution)。取反號在本篇介紹的所有匹配模式中都有效。請注意:通配符*與取反號連用,很容易產生問題。猜猜rm *!6*.bak表示什么?這個命令將刪除所有文件,甚至包括名稱中包含6的文件。如果您將通配符*放到了取反號前面和后面,實際上取

4、反號將失效,因為shell將其解釋為所有名稱中任何位置都不含該字符 的文件“。在我們的例子里,只有文件666.bak不符合該模式。第二個通配符是問號(question mark) : ?在匹配時,一個問號只能代表一個字符。為了示范其用途,我們在上例的假設中添加兩個 新文件:311.bak和some.text?,F(xiàn)在,列出所有在點號后有四個字符的文件:ls *.?問號通配符能夠有效地避免上面提到的取反號陷阱(negation trap) : rm *!4?.*將擴展成所有除了點號前倒數(shù)第二個字符為4的文件,也就是只保留文件346.bak。您可能會問,有沒有其他匹配方式?到目前為止,您只看到了在指定

5、位置匹配唯一字符的方法。但其實您也可以這樣:ls 13*將列出所有以字符T或3開頭的文件;在我們的例子中,文件124.bak、311.bak和346.bak匹配。注意到您必須用中括號將匹配的模式括起來,否則模式只匹配以字符串13開頭的文件。接下來,您將高興地看到還可以定義匹配的范圍:ls *3-8?.*將列出所有點號前倒數(shù)第二個字符落在3到8范圍的文件。在我們的例子中,匹配的文件是346.bak和583.bak。引用shell的特殊字符但是,上面的那些機制存在一個缺點:shell總在命令執(zhí)行前,試著進行擴展。有時候,會變得很棘手:文件名包含特殊字符。假設您在那個目錄中還有一個名為!56.bak

6、的文件。下面試圖進行模式匹配:rm !*rm rm: too few argumentsshell將!*解釋成歷史記錄的替換(加入前一個命令的所有參數(shù)),而不是匹配方式。命令本身帶特殊字符作參數(shù)。一些linux下的命令行工具,比如(e)grep、sed、awk、find及l(fā)ocate,都使用自己的正則表達式(regular expressions)0這些表達式與模式匹配看起來驚人地相似,但在某些地方又有所不同。但為了使這些特殊命令生效,shell就不能先將其當作模式匹配來解釋:find . -name 1-9* -printfind: paths must precede expression

7、應該是:find . -name 1-9* -print./346.bak./124.bak./583.bak./311.bak您可以通過反斜線(back slash)來引用特殊字符,比如!、$、?或空格:ls !*!56.bak或者用(單)引號:ls !*!56.bak請注意,要看清楚引號應該放在什么位置0命令ls !*將查找名為!*的文件,這是由于通配符也在引號間,所以只能依照字面來解釋。輸出重定向Unix的理念是匯集許多小程序,每個東東都有特殊的專長。復雜的任務不是由大型軟件完成,而是運用shell的機制,組合許多小程序共同完成。重定向就在其中發(fā)揮著重要的作用。在多個命令間重定向這要通過

8、管道(pipe),由管道符號|來標識。語法是:command1 | command2 | command3等等。這種格式您一定已經見到過了。管道經常將一個程序的輸出送到more或less來閱讀。ls -l | less其中,第一個命令提供目錄內容,第二個則將其以翻頁的方式顯示。更復雜的例子如:rpm -qa | grepAx | less第一個命令給出所有已安裝的RPM包,第二個則將其過濾(filter : grep),只剩下以人乂開頭的包,第三個命令則將結果以翻頁的方式顯示。重定向至文件有時,您希望將命令的輸出結果保存到文件中,或以文件內容作為命令的參數(shù)0這可以通過和 file將comman

9、d的輸出保存到file中,這將覆蓋file中的內容:ls dirlist將當前目錄的內容保存到dirlist文件。command file將file內容作為command的輸入:sort sdirlist將文件dirlist的內容送到命令sort,然后再將排序后的結果送到文件sdirlist。當然,您也可以一步到位:ls | sort sdirlist一種特殊的方式是command 2 file。這將command執(zhí)行的出錯信息送到file中。這個您到時候會需要另一種操作符是,這將輸出添加到已存在的文件中:echo string file將string加到文件file中。這是不打開文件而完成編輯的好辦法!但是,操作符都有一個重要的限制:command filel將刪除filel的內容,而command filel卻可以很好地工作,將加工過的filel內容加回到文件中。熟知了許多shell的機制后,您可能急著想知道如何來定制環(huán)境。在后面的兩篇中,您將得到這方面的啟示。在最后一篇中,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論