自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux BASH Shell文件名匹配/輸出重定向

運維 系統(tǒng)運維
文件名匹配使得您不必一一寫出名稱,就可以指定多個文件。您將用到一些特殊的字符,稱為通配符(wildcards)。

文件名匹配/輸出重定向

文件名匹配
文件名匹配使得您不必一一寫出名稱,就可以指定多個文件。您將用到一些特殊的字符,稱為通配符(wildcards)。
假設(shè)您想用'rm'命令刪除目錄下所有以字符串'.bak'結(jié)尾的文件。除了在'rm'后跟上所有文件名作為參數(shù),您還可以用通配符'*':
rm *.bak
'*'可匹配一個或多個字符。在本例中, 您告訴 shell 將命令'rm'的參數(shù)擴展到"所有以'*.bak'結(jié)尾的文件",shell 就將擴展后的參數(shù)告訴'rm'命令。您將看到,shell 在命令執(zhí)行前,就將讀取并解釋命令行。正是因為這個,您才可以將通配符用于 shell 命令的參數(shù)中。
讓我們更進一步來認識通配符'*'。假定您有個目錄,其中含文件'124.bak'、'346.bak'及'583.bak'。您想只保留文件'583.bak',可以用:
rm *4*.bak
shell 就將'*4*.bak'擴展成"所有含'4'并以'.bak'結(jié)尾的字符串"。
注意到 rm 4*.bak 無法工作,因為這匹配的是以'4'開頭的文件。由于目錄中沒有這樣的文件,shell 將這個模式擴展為空的字符串,故'rm'將返回出錯信息:rm: cannot remove `4*.bak': No such file or directory
如果您想保留文件'346.bak',而刪除'124.bak'和'583.bak'。這看起來有些難度, 因為被刪文件的名稱除了后綴其他都不同。但幸運的是,您可以用不含有來指定文件:rm *[!6].bak
這將被讀為:除了以'6.bak'結(jié)尾的文件,刪除其他所有以'.bak'結(jié)尾的文件。 您必須將取反號(negation sign)與取反字符(這里是 6)放到括號中,不然的話,shell 會將驚嘆號(exclamation mark)解釋成歷史記錄替換的開始(the beginning of a history substitution)。
取反號在本篇介紹的所有匹配模式中都有效。

請注意:通配符'*'與取反號連用,很容易產(chǎn)生問題。猜猜rm *[!6]*.bak表示什么?這個命令將刪除所有文件,甚至包括名稱中包含'6'的文件。如果您將通配符'*'放到了取反號前面和后面,實際上取反號將失效,因為 shell 將其解釋為"所有名稱中任何位置都不含該字符的文件"。在我們的例子里,只有文件'666.bak'不符合該模式。

第二個通配符是問號(question mark):'?'。在匹配時,一個問號只能代表一個字符。為了示范其用途,我們在上例的假設(shè)中添加兩個新文件:'311.bak~'和'some.text'?,F(xiàn)在, 列出所有在點號后有四個字符的文件:
ls *.????
問號通配符能夠有效地避免上面提到的'取反號陷阱'(negation trap):rm *[!4]?.*
將擴展成"所有除了點號前倒數(shù)第二個字符為'4'的文件",也就是只保留文件'346.bak'。您可能會問,有沒有其他匹配方式?到目前為止,您只看到了在指定位置匹配唯一字符的方法。但其實您也可以這樣:
ls [13]*
將列出所有以字符'1'或'3'開頭的文件;在我們的例子中,文件'124.bak'、'311.bak~'和'346.bak'匹配。注意到您必須用中括號將匹配的模式括起來,否則模式只匹配以字符串'13'開頭的文件。接下來,您將高興地看到還可以定義匹配的范圍:
ls *[3-8]?.*
將列出所有點號前倒數(shù)第二個字符落在'3'到'8'范圍的文件。在我們的例子中,匹配的文件是'346.bak'和'583.bak'。

引用 shell 的特殊字符
但是,上面的那些機制存在一個缺點:shell 總在命令執(zhí)行前,試著進行擴展。有時候,會變得很棘手:
文件名包含特殊字符。
假設(shè)您在那個目錄中還有一個名為'!56.bak'的文件。下面試圖進行模式匹配:
rm !*
rm
rm: too few arguments
shell 將'!*'解釋成歷史記錄的替換(加入前一個命令的所有參數(shù)),而不是匹配方式。

命令本身帶特殊字符作參數(shù)。
一些 linux 下的命令行工具,比如 (e)grep、sed、awk、find 及 locate ,都使用自己的正則表達式(regular expressions)。這些表達式與模式匹配看起來驚人地相似, 但在某些地方又有所不同。但為了使這些特殊命令生效,shell 就不能先將其當(dāng)作模式匹配來解釋:
find . -name [1-9]* -print
find: paths must precede expression
應(yīng)該是:
find . -name '[1-9]*' -print
./346.bak
./124.bak
./583.bak
./311.bak~

您可以通過反斜線(back slash)來引用特殊字符,比如 ! 、$ 、? 或空格:
ls !*
!56.bak
或者用(單)引號:
ls '!'*
!56.bak
請注意,要看清楚引號應(yīng)該放在什么位置。命令 ls '!*' 將查找名為'!*'的文件, 這是由于通配符也在引號間,所以只能依照字面來解釋。

輸出重定向
Unix 的理念是匯集許多小程序,每個東東都有特殊的專長。 復(fù)雜的任務(wù)不是由大型軟件完成,而是運用 shell 的機制,組合許多小程序共同完成。重定向就在其中發(fā)揮著重要的作用。

在多個命令間重定向
這要通過管道(pipe),由管道符號|來標(biāo)識。語法是:command1 | command2 | command3 等等。這種格式您一定已經(jīng)見到過了。管道經(jīng)常將一個程序的輸出送到'more'或'less'來閱讀。
ls -l | less
其中,第一個命令提供目錄內(nèi)容,第二個則將其以翻頁的方式顯示。更復(fù)雜的例子如:rpm -qa | grep ^x | less
第一個命令給出所有已安裝的 RPM 包,第二個則將其過濾(filter:'grep'),只剩下以'^x'開頭的包,第三個命令則將結(jié)果以翻頁的方式顯示。

重定向至文件
有時,您希望將命令的輸出結(jié)果保存到文件中,或以文件內(nèi)容作為命令的參數(shù)。這可以通過'>'和'<'來實現(xiàn)。
command > file將 command 的輸出保存到 file 中,這將覆蓋 file 中的內(nèi)容:
ls > dirlist
將當(dāng)前目錄的內(nèi)容保存到'dirlist'文件。
command < file
將 file 內(nèi)容作為 command 的輸入:
sort < dirlist > sdirlist
將文件'dirlist'的內(nèi)容送到命令'sort',然后再將排序后的結(jié)果送到文件'sdirlist'。當(dāng)然,您也可以一步到位:ls | sort > sdirlist
一種特殊的方式是'command 2> file'。這將 command 執(zhí)行的出錯信息送到 file 中。這個您到時候會需要另一種操作符是'>>',這將輸出添加到已存在的文件中:
echo "string" >> file
將 string 加到文件 file 中。這是不打開文件而完成編輯的好辦法!
但是,'<'和'>'操作符都有一個重要的限制:command < file1 > file1將刪除 file1 的內(nèi)容,而command < file1 >> file1卻可以很好地工作,將加工過的 file1 內(nèi)容加回到文件中。
熟知了許多 shell 的機制后, 您可能急著想知道如何來定制環(huán)境。在后面的兩篇中,您將得到這方面的啟示。在最后一篇中,還有一段如何處理 shell 出錯信息的常見問答(FAQ),及一些配置技巧。
 

【編輯推薦】

  1. Linux Bash命令關(guān)于程序調(diào)試詳解 
  2. Linux Bash命令關(guān)于快捷鍵應(yīng)用
  3. Linux Bash Shell系統(tǒng)的應(yīng)用詳解
  4. Linux Bash具體安裝步驟及使用介紹
  5. Linux Bash命令查詢相關(guān)事件詳解
責(zé)任編輯:chenqingxiang 來源: linux寶庫
相關(guān)推薦

2009-12-25 16:21:41

shell命令

2014-09-04 11:39:43

Linux

2022-11-10 15:08:44

Linux輸入輸出

2020-12-09 11:10:12

shellLinux管道

2009-12-25 16:53:25

Linux Bash命

2010-03-01 14:45:07

Linux文件重定向

2009-06-29 09:57:05

Unix

2020-07-27 07:41:23

Linux重定向數(shù)據(jù)流

2010-12-31 13:35:25

文件夾重定向

2020-02-24 11:37:56

Linux重定向管道

2010-12-14 15:07:15

ICMP路由重定向

2022-11-17 08:40:14

Linux輸出錯誤重定向

2010-06-23 17:34:03

Linux Bash

2010-03-09 16:11:59

Linux重定向

2017-01-19 19:14:20

Linux重定向命令

2010-06-23 16:35:50

Linux Bash

2010-06-23 17:37:14

Linux Bash

2014-08-07 10:23:24

linux重定向

2020-11-05 14:28:07

Shell腳本SQL

2011-04-20 10:15:02

Linuxconsole口
點贊
收藏

51CTO技術(shù)棧公眾號