嗨!歡迎回到上班族的命令列生存手冊,前一章節介紹一個危險的東西,大家下之前有沒有特別小心呢?這一章節將會是基礎操作篇的最後一篇,將會來介紹如何串連多個指令。之前在用命令列指令,大部分都是以單一指令為準,比如說:ls
、cat
、cp
… 等。雖然大部分的狀態這樣已經可以完成任務,但是分工合作可以蹦出更多火花,工具能聯合起來用,這就是本章要來介紹的。
管子。用管子就可以把指令銜接起來,什麼意思阿?比如說,這個指令 grep
,用途是從 input 過濾出字串。比如想從目錄之中找檔案,在這個目錄中有 sample 這個檔案嗎?可以這樣下:
$ ls | grep sample
如果有的話就會印出符合條件的行。
另外一個例子是配合 wc
這個指令,wc
(word counts) 是用來計算文字數量的指令。配合前面介紹過的 cat
可以拿來計算行數:
$ cat Sample.java | wc --lines
pipe 可以把指令不斷的往下接,結合上面學到的 grep
和 wc
,可以接上兩個 pipe 來實作:符合條件的有幾個。例如,資料夾下面有四個檔案:hello.txt、xaa、xab 和 xac,上面學到,如果我想知道本目錄下有幾個 xa 開頭的檔案,我只需要下:
$ ls | grep xa
ls
就會印出來符合條件的結果。這個時候可以加上 wc ,計算結果的數量:
$ ls | grep xa | wc --lines
會印出 3 ,直接計算有幾個符合的項目。本範例想說的是只要可行,後面幾乎可以再 pipe 更多的指令,看來只有想像力是 pipe 的上限。
要搜尋文字檔裡頭的內容,不需要先用 cat
。
$ cat sample.txt | grep "寂寞"
直接用 grep
就行了,關鍵字後面再加上欲搜尋的文字檔案即可。
$ grep "寂寞" sample.txt
上面兩個指令輸出完全是一樣的。
grep
:依照給他的關鍵字,過濾 inputwc
:可用來計算文字的數量已經到了第 17 篇,讀者也默默的獨自升級了 17 日。應該會發現「欸,pipe 不是每個都有反應?」用上面提到的例子作為範例,例如我想要刪除所有 xa 開頭的檔案:
$ ls | grep xa | rm
這樣下就會沒有反應,怎麼讓他動起來?還記得我們在很久很久以前介紹過,有些參數會從 Standard Input (STDIN,編號是 0),讀取輸入指令嗎?(應該是第二篇) 像是 cat
這類的,wc
也是這種的,輸入指令後不打字,會等待你從鍵盤輸入字給他。
不過,有些命令只可以吃參數,有點像程式的 Method/Function,例如 rm
,直接下 rm
就會印出錯誤訊息。
這時就需要 xargs
這個指令,他能把 pipe 過來的東西變成其他指令的參數。
$ ls | grep xa | xargs <接收參數的其他指令>
就範例來說,這樣就可以正常運行:
$ ls | grep xa | xargs rm
由 ls | grep xa
而來的 input 就會作為 rm 的參數被傳進去。
xargs
可以用 -t
來印出指令做了什麼。
$ ls | grep xa | xargs -t rm
就會印出:rm xaa xab xac
。
xargs 還可以指定參數的位置,以上面的範例來說,例如我們要重新命名 xa 開頭檔案,全部加上 .txt
,還記得重新命名就是 mv
指令嗎?
$ mv xaa xaa.txt
配合 $ ls | grep xa
過濾出 xa 開頭的檔案,接著用 xargs
的 -I
指令。這個指令需要告訴 xargs
一個我們說好的符號,他會把這個符號取代成 input。
$ ls | grep xa | xargs -I <符號> mv <符號> <符號>.txt
<符號>
就會被取代成 mv xaa xaa.bak
… 依序印出被濾出的檔案。筆者比較喜歡用 {}
來表示符號。
$ ls | grep xa | xargs -I {} mv {} {}.txt
把 mv
換成 cp
,就能做出過濾某些檔案,並且執行複製,限制就剩下使用者的想像力。
基礎操作篇在熟悉環境篇之上增加了 CRUD 操作 (增加 touch, mkdir
、讀取 pipe and grep
、更新 touch, cp, mv
、刪除 rm
),而且還介紹讀者一個超讚的 Shell — zsh,配合 Framework 使用簡直是蛋糕上的櫻桃,不能再更棒了!並且,介紹串連多個指令(pipe,xargs
)來達成更多的事情。
觀念的部份, rm 的章節介紹了 root 名詞的多種詮釋— 一個是地名(根目錄 root directory),一個是人名(超級使用者 root account)。軟連結和硬連結的部份,就像阿妹和阿密特,同一個人不同的名子。
這篇結束之後命令列的操作應該難不倒你了。不過,我們依然有很多東西沒有介紹。下一章節將是進階觀念篇的第一章,筆者又要來介紹一款 Shell,自稱 21 世紀的 Shell,我們下個章節見啦。