Linux 參考手冊

来源:百度文库 编辑:神马文学网 时间:2024/04/29 10:47:50
目錄
2.指令行介紹
2.1.檔案處理公用程式
2.2.處理檔案屬性
2.3.shell 的檔名展開與常規表示式 ( Globbing patterns and Regular expressions )
2.4.重導向與管線 ( Redirections and pipes ) 
2.5.自動補齊 ( Completion )
2.6.開始與處理背景行程:工作控制
2.7.最後的叮嚀
5.Linux 檔案系統:ext2fs ( Extended 2 FileSystem )
5.1.所有東西均是檔案
5.2.連結 
5.3.無名管道及有名管道
5.4.特殊檔案:字符模式及區塊模式檔案
5.5.符號連結及硬連結之限制
5.6.檔案屬性
11.檔案系統及掛載點
11.1原理
11.2分割硬碟及格式化分割區
11.3mount 及 umount 指令
11.4/etc/fstab 檔案
12.命令列工具程式
12.1grep(General Regular Expression Parse): 文字通用規則剖析
12.2find: 依照設定的準則找出檔案
12.3crontab: 向使用者提出報告或編輯 crontab 檔
12.4at: 命令排程,但只能執行一次
12.5tar: 錄製備份
12.6bzip2 和 gzip: 壓縮程式
12.7還有很多其他的指令
附註.正規化表示式(Regular Expression)簡介
第十一章 檔案系統及掛載點
目錄11.1原理
11.2分割硬碟及格式化分割區
11.3mount及umount指令
11.4/etc/fstab檔案
實例是瞭解事物運作機制的良方,接下來我們將以實例的方式來做說明。假設你剛買回來一個全新的硬碟,沒有分割區在上頭。 Linux-Mandrake分割區已無空間,由於長痛不如短痛,決定將目錄結構中,一個完整的部分移動到新硬碟。因為新硬碟很大,所以決定移動最大的目錄/usr。在此之前,先談一點理論上的東西。
正如我們在安裝手冊中所提到,硬碟可以分割成數個分割區,每個分割區有一個檔案系統。相對於Windows系統給予每個分割區一個磁碟機代號(事實上只對能夠找到的分割區),Linux有單一的檔案樹狀結構,每個檔案系統掛載在樹狀結構的一個地方。
正如Windows需要一個C:磁碟機,Linux必須能夠將檔案樹的根(/)掛載到某個地方,這個地方通常是存放root檔案系統的分割區。只要根結構掛載,就能夠掛載其他的檔案系統到樹狀結構上不同的掛載點。在根結構之下的任何目錄,都可以當作掛載點。
如此設定上有很大的彈性,以網頁伺服器為例,通常將整個分割區指定給放置網頁伺服器資料的目錄,目錄名稱通常為/home/httpd,這個目錄就可以當作掛載點,圖11-1和11-2是系統在掛載前後的情形。


這樣的作法,有很多好處,最重要的是無論樹狀結構的範圍,為一個檔案系統或是數打的檔案系統,樹狀結構都不會改變。這樣的架構下,當分割區空間不夠時,可以實際將樹狀結構的重要部分移動到另一個分割區。我們接下來就要做這樣的操作:
對於掛載點,有兩件事情不可不知:
作為掛載點的目錄必須存在。
目錄必須是空的:如果選作掛載點的目錄原先就有次目錄及檔案,他們會被新掛進來的檔案系統隱藏。
11.2 分割硬碟及格式化分割區
依據前面的原理,硬碟可以分割成數個分割區,每個分割區擁有一個檔案系統。新硬碟上一個分割區也沒有,要從分割硬碟開始做,你要以root身分來做這件事。
首先要知道硬碟的名稱(系統的命名),架設你將新硬碟設為第一IDE介面上的第二部硬碟機,他的名稱將會是/dev/hdb (磁碟機命名的方法已在安裝手冊上介紹)。
11.3 mount及umount指令
現在檔案系統已經產生,可以掛載分割區,當然開始是空的,掛載檔案系統的指令是mount,語法為:
mount  [參數] <-t 型態> [-o 掛載選項] <裝置> <掛載點>
在這個例子,我們將分割區掛載/mnt(或其他你想要選的目錄,但是別忘了這個目錄一定要存在),掛載我們剛做的分割區的指令是:
$mount –t ext2 /dev/hdb1 /mnt
-t選項指定分割區的檔案系統型態,最常碰到的檔案系統是ext2(Linux預設檔案系統),vfat(所有DOS/Windows分割區: FAT 12, 16或32)及iso9660(光碟機檔案系統)。
-o 選項指定一個或以上的掛載參數,決定於使用的檔案系統,相關細節詳見man 8 mount的線上手冊。
現在已將新分割區掛載到系統上,你要將整個目錄/usr拷貝過來:
$ (cd /usr && tar cf -.)|(cd/mnt && tar xpvf -)
檔案拷貝好,使用umount指令,將分割區解除掛載 ,語法為:
$ umount /mnt

$ umount /dev/hdb1
因為這個分割區要作為/usr目錄,我們必須在系統上做一些更動。
11.4 /etc/fstab檔案
/etc/fstab可以自動掛載特定的檔案系統,特別在系統啟動的時候。在這個檔案裡,描述了檔案系統,掛載點和其他選項。下面是一個/etc/fstab檔案的內容:
/dev/hda1      /                 ext2         defaults             1 1 /dev/hda5     /home          ext2        defaults            1 2 /dev/hda6     swap          swap       defaults            0 0 /dev/fd0      /mnt/floppy   auto        sync,user,noauto,nosuid,nodev,unhide 0 0 /dev/cdrom    /mnt/cdrom  auto        user,noauto,nosuid,exec,nodev,ro 0 0 none          /proc           proc        defaults            0 0 none          /dev/pts        devpts    mode=0622       0 0
每一行的參數按照順序代表
擁有檔案系統的裝置,
掛載點
檔案系統型態
掛載選項
備份程式dump的旗標
fsck(FileSystem ChecK)檢查分割區的順序
在這個檔案裡,很奇怪總是有一個root檔案系統的進入點。swap分割區很特別,因為在樹狀結構中是看不到的,在掛載點參數填入swap關鍵字,在談到/proc時會再詳細說明。
言歸正傳,目前已將整個/usr階層移到/dev/hdb1,希望在啟動時就能把這個分割區掛載到系統上,必須在檔案中加上這一行:
/dev/hdb1 /usr ext2 defaults 1 2
從今以後每次啟動分這個分割區會自動被掛載,如果必要也會自動檢查。
有兩個比較特別的參數:noauto及usr。noauto不在啟動時掛載檔案系統,但可手動掛載。至於usr可讓任何使用者可以掛載或移除檔案系統,在上面那個例子裡,這兩個選項使用在軟碟機及唯讀光碟機,參考man 5 fstab線上手冊可以知道/etc/fstab更多的設定參數。
最後/etc/fstab的好處是簡化mount指令的語法,可以參考該檔案的掛載點或裝置,掛載檔案系統,例如掛載一個軟式磁碟機,你可以鍵入:
$ mount /mnt/floppy

$ mount /dev/fd0
在移動分割區的例子中,已經複製/usr目錄及完成/etc/fstab檔案的修改,但是原先/usr檔案還在,刪除將空間釋放出來(這是我們原先的目的),我們首先要刪除在/usr目錄中的所有檔案(當然是原先的舊檔,新的那一個還沒被掛載),請鍵入
rm –Rf /usr/*
然後掛載上新的/usr目錄:
mount /usr
這樣就好啦,如果沒有其他的系統管理工作,應該現在就登出root這個帳號。
第二章 指令行介紹
目錄
2.1.檔案處理公用程式
2.1.1.mkdir,touch:建立空的目錄及檔案 ( MaKe DIRectory )
2.1.2.rm:刪除檔案或目錄 ( ReMove )
2.1.3mv:移動檔案或更名 ( MoVe )
2.1.4.cp:複製檔案和目錄 ( CoPy )
2.2.處理檔案屬性
2.2.1.chown,chgrp:改變一或多個檔案的擁有者和群組
2.2.2.chmod:變更檔及目錄的權限 ( CHange MODe )
2.3.shell的檔名展開與常規表示式 ( Globbing patterns and Regular expressions )
2.4.重導向與管線 ( Redirections and pipes )
2.4.1.關於行程的二三事
2.4.2.重導向
2.4.3.管線
2.5.自動補齊 ( Completion )
2.5.1.範例
2.5.2.多多益善
2.6.開始與處理背景行程:工作控制
2.7.最後的叮嚀
在《使用者指南》『基本Unix觀念』的章節裡面已經告訴了你如何進入Shell。而在這章中,我們將會讓你看到該如何使它工作。
Shell最重要的資源就是已存在的眾多公用程式:它們數以千計,而且每一個都對一個特別的工作有自己的貢獻。在這裡我們將只專注於其中少數的幾個。如同稍後我們將看見的一般,Unix最好的資源之一就是統合這些公用程式的能力。
在這裡的檔案處理指的是複製、搬移以及刪除檔案。稍後,我們將會著眼於變更它們的屬性(擁有者、許可權)的方法。
mkdir是用來建立創造目錄。它的語法很簡單:
mkdir [選項] <目錄名1> [目錄名2 ﹍]
只有一個選項值得注意:-p這個選項。要是設定了這個選項,假使以前並不存在這些父目錄,那麼mkdir將會先產生它們。如果不指定這個選項的話,同時父目錄也不存在,那麼mkdir就會顯示錯誤訊息。舉例:
1. mkdir foo 會在目前的目錄裡建立一個叫foo的目錄;
2. mkdir –p images/misc docs 如果images這個父目錄不存在的話,系統會先建立它,然後在它裡面建立misc這個目錄,而且同時建立一個名為docs的目錄。
起初touch指令並不是設計來建立檔案而是在於更新檔案的存取及修改時間[1]。然而,它的一個副作用是建立被提及但之前並不存在的檔案。它的語法是:
touch [選項] 檔案名1 [檔案名2 ﹍]
那麼執行指令:
touch file1 images/file2
將在目前的目錄裡建立一個名為file1的檔案和images目錄中的file2檔案。
這個指令不僅能夠取代del和deltree這二個DOS指令而且還能給你更多。它的語法如下所示:
rm [選項] <檔案名1|目錄名1> [檔案名2|目錄名2 ﹍]
選項包括:
–r或-R遞迴刪除。這個選項會強制刪除一個目錄而不管它裡面是否是空的。然而,也有指令rmdir是用來刪除空的目錄。  -i在每次刪除前都會要求確認。建議在你的Shell設定裡把原始的rm指令改別名成rm –i,同樣地cp和mv指令也如法炮製。  -f相對於-i,就算使用者沒有檔案上的寫入授權也會強制刪除檔案或目錄[2]。
一些實例:
rm –i images/misc/*.jpg file1 確認刪除在images目錄裡檔名結尾是.jpg的所有檔案以及目前目錄的file1檔案之刪除動作,回答y確認執行刪除而n則取消。  rm –Rf images/misc/ file* 將images/底下misc/目錄裡的所有一切及目前目錄以file開頭的檔案一起刪除而無須確認。

使用rm刪除檔案將無法挽回。沒有任何回復檔案的方法!別猶豫使用-i這個選項。
mv指令的語法如下:
mv [選項] <檔案名1|目錄名1> [檔案名2|目錄名2 ﹍] <目的地>
一些選項:
-f 強制移動檔案─即使有可能因為這個選項而覆寫了已存在的檔案也不發出警告。  –i 抗拒移動─在覆寫已存在檔案前皆要求使用者確認。  –v 冗長( Verbose )模式,會報告所有改變。
一些例子:
mv –i /tmp/pics/*.gif . 將/tmp/pics/目錄裡以.gif結尾的所有檔案移動到目前的目錄(.),並且在覆寫所有檔案前皆要求確認。  mv foo bar將檔案foo重新命名成bar。  mv –vf file* images/ trash/ 一起移動目前目錄內用file開頭以及images/裡所有的檔案到trash/目錄而無須要求確認並且顯示每一個執行步驟。
cp能夠代替並多過copy和xcopy這二個DOS指令。它的語法如下:
cp [選項] <檔案名1|目錄名1> [檔案名2|目錄名2 ﹍] <目的地>
它有一大串的選項。這些是最常見的:
–R遞迴複製;即使是空的目錄也要強制複製。   –i在可能覆寫到任何檔案時尋求確認。   –f相對於-i,取代任何存在的檔案而無須確認。   –v冗長模式,會記錄被cp執行的所有動作。
一些例子:
cp –i /tmp/images/* images/ 從/tmp/images目錄將所有檔案複製到目前目錄裡的images/;若有個檔案將被覆寫就會要求確認。   cp –vR docs/ /shared/mp3s/* mystuff/ 複製整個docs目錄加上/shared/mp3s裡的所有檔案到位於目前所在的mystuff目錄底下。   cp foo bar 在目前的目錄複製foo檔案內容到bar裡。
備註:
[1] Unix的每一個檔案都有三個不同的時間標記:檔案最近存取日期 (atime),也就是檔案因讀出或寫入而開啟的最後日期;inode屬性被修改的最近日期(mtime);最後還有檔案內容被修改的最近日期(ctime)。
[2] 即使不是檔案的擁有者,對刪除它們而言,使用者擁有該目錄的寫入存取權限就足夠了。
2.2. 處理檔案屬性
這裡顯示的一系列指令是用來改變檔案的擁有者、擁有者群組或是檔案權限。我們可以在《使用者指南》『基本Unix觀念』看到不同的權限。
chown指令的語法如下:
chown [選項] <使用者[.群組]> <檔案名1|目錄名1> [檔案名2|目錄名2 ﹍]
 
選項包括:
-R 遞迴;改變一個給定目錄裡所有檔案及子目錄的擁有者。   –v 冗長模式;描述由chown執行的所有動作;報告哪些檔案由於指令的結果改變了擁有者以及哪些檔案還沒有改變。   –c 類似-v,不過只報告哪些檔案被改變。
一些例子:
chown nobody /shared/book.tex 將/shared/book.tex擁有者改成nobody。   chown –Rc john.music *.mid concerts/ 將目前目錄裡以.mid結尾的檔案以及concerts/目錄裡的所有檔案及子目錄的擁有者屬性改成使用者john和music群組,只報告為指令所影響的檔案。
chgrp指令讓你改變一個(或多個)檔案的群組所有權;它的語法與chown非常類似:
chgrp [選項] <群組> <檔案名1|目錄名1> [檔案名2|目錄名2 ﹍]
 
這個指令的選項與chown相同,並且使用方法也類似。因此指令:
chgrp disk /dev/hd*
會把/dev/目錄裡以hd開頭的所有檔案屬性換成disk這個群組。
chmod指令有個非常清楚的語法。一般的語法是:
chmod [選項] <改變模式> <檔案名1|目錄名1> [檔案名2|目錄名2 ﹍]
 
但是要區別的是它的改變模式有著不同的形式。它可以用二種方式敘述:
以八進位表示;擁有者的使用者權限與00形式的數字相符合,在這裡相當於所指定的權限:4是讀取(Read)權限、2是寫入(Write)權限以及1是執行(Execute)權限;同樣地,擁有者群組權限採用0的形式,而「其他人」權限形式為。然後所有你所需要做的是把全部指定的權限加總起來得到正確的數字。因此,權限rwxr-xr--相當於400+200+100 (擁有者權限,rwx) +40+10 (群組權限,r-w) +4 (其他人權限,r--) = 754;用這個方式,權限是以絕對的形式來表示:早先的權限會無條件地被取代。
用陳述法表示:在這裡權限表示是一組連續用逗點分開,形式是[種類]<+|-><權限>的陳述。種類可能是一或多個的u (User,擁有者權限),g (Group,擁有者群組權限)或o (Others,「其他人」的權限)。如果不指定種類的話表示這改變適用於所有的種類。「+」設定權限,「一」移除權限。最後,權限的表示是一或多個的r (Read,讀取),w (Write,寫入)或x (eXecute,執行)。
主要的選項和chown或chgrp相當相似:
–R 遞迴改變權限。   –v 冗長模式,描述每個檔案執行的動作。   –c 類似-v但只顯示已經改變權限的檔案。
例子:
chmod –R o-w /shared/docs 遞迴移去/shared/docs/目錄裡所有檔案及子目錄「其他人」的寫入權限。   chmod –R og-w,o-x private/ 遞迴移去整個private/目錄群組和其他人的寫入權限以及其他人的執行權限。   chmod –c 644 miscellaneous/file* 將miscellaneous/目錄裡所有名字以file開頭的檔案之權限改成rw-r—r--(也就是每個人都有讀取權限而只有擁有者有寫入權限),並且只報告有改變產生的檔案。
2.3. shell的檔名展開與常規表示式 ( Globbing patterns and Regular expressions )
你或許已經在使用檔名展開(globbing)字元卻不瞭解它。當你在微軟視窗作業系統寫入或尋找一個檔案的時候,你使用*來匹配一個任意的字串。舉例來說,*.txt匹配的是所有命名以.txt做結尾的檔案。我們在最後一段也要大量地使用它。不過會是比*更多的檔名展開。
當你鍵入一個像ls .txt一樣的指令並按下「確定」的時候,尋找能夠匹配*.txt的檔案工作並不是由ls來做,而是由shell自己親自執行。這需要一個有關指令行如何被shell所中斷的小小解釋。當你鍵入:
$ ls *.txt
readme.txt recipes.txt
 
指令行一開始被字詞所分開(在這個例子裡是ls和*.txt)。當它在字詞中找到*時,會把整個字詞解釋成檔名展開,而且用所有可匹配的檔名來代替它。因此,剛剛那行指令在shell執行它前會變成我們預期的結果:ls readme.txt recipes.txt。其他的字元也會讓shell做出這樣的反應:
匹配唯一且僅有的字元,無論是什麼字元;   […] 匹配在方括弧裡發現的任何字元;被提起的字元可以是一個範圍內的字元(譬如1-9)或不連續的數值,甚至二者皆有。例如:[a-zBE5-7]將會匹配從a到z、B、E、5、6、7、這裡面所有的字元;   [!…] 匹配在方括弧裡找不到的任何字元。舉例來說,[!a-z]將會匹配不是小寫字母的任何的字元;   {c1,c2} 匹配c1或c2,在這裡c1和c2也是檔名展開。
這裡是一些檔名展開以及它們的含意:
/etc/*conf 在/etc裡所有名字以conf結尾的檔案。它不僅能夠匹配/etc/inetd.conf,也可以匹配/etc/conf.linuxconf,並且也會是/etc/conf,要是這個檔案存在的話。要記住*可以匹配一個空的字串。   image/cars,space[0-9]/*.jpg 要是這些目錄都存在的話,在image/cars,image/space0,…,image/space9裡面以.jpg結尾的所有檔案。   /usr/doc/*/README 在/usr/doc下層子目錄裡面名字是README的全部檔案。例如這會讓/usr/doc/mandrake/README匹配我們想要的,而/usr/doc/myprog/doc/README就不是了。   *[!a-z] 在目前目錄裡名字不是以小寫字母結束的所有檔案。
2.4. 重導向與管線 ( Redirections and pipes )
為了要了解重導向和管線的原理,我們需要解釋有關行程尚未被介紹到的觀念。每個Unix行程(這也包括圖形介面的應用程式)至少開啟三個檔案描述符號(descriptor):標準輸入,標準輸出以及標準錯誤。它們的數字分別是0,1和2。一般而言,從行程一開始,鍵盤一輸入,這三個描述符號就和終端機結合在一起。重導向和管線的目的就是讓這些描述符號改變方向。這個章節的例子將幫助你更瞭解些。
舉例來說,想像你想要一個images目錄裡以.gif[1]結尾檔案的明細。這明細非常長,因此你想要把它存成檔案以供日後空閒時能夠好好察看一番。你可以輸入底下的指令:
$ ls images/*.gif 1>file_list
 
這表示這個指令的標準輸出(1)會被重導向(>)到名為file_list的檔案。這個「>」運算子是輸出重導向運算子。若要重導向的檔案不存在的話,系統會新建一個;但如果這個檔案早已存在,那麼它先前的內容就會被覆寫掉。然而,由於原先被這個運算子重導向的預設描述符號是標準輸出而且無須在指令行中特別指定,因此你可以把上例寫得較簡潔些:
$ ls images/*.gif >file_list
 
而這結果將會完全相同。接下來你就可以用文字檔檢視程式如less來看看這個檔案了。
現在想像你想要知道這檔案裡有多少東西。你可以用一個公用程式叫做wc(Word Count,計算字數)和-l選項把這個檔案的行數寫到標準輸出上來代替自己用手來計算。一個解決方式如下:
wc –l 0 
那麼這樣就會帶給我們想要的結果了。這個「<」運算子是輸入重導向運算子,同樣地,預設的重導向描述符號是標準輸入,也就是0。你需要把這行簡寫成:
wc –l  
現在假設你想要檢查這檔案,拿掉所有的「延伸檔名」並把結果放到另一個檔案。一個可以這麼做的工具是sed,也就是Stream EDitor。你要做的僅僅是重導向sed的標準輸入到file_list這個檔案並且把輸出重導向到結果的檔案,例如the_list上:
sed –e ‘s/\.gif$//g’ the_list
 
這樣你要的明細就產生了,準備好會議時從容地使用檢視程式察看一番。
它對重導向標準錯誤也是有用的。舉例來說,你想要知道你不能存取/shared裡的哪個目錄。一個解決的方法是遞迴地列出這個目錄而不顯示到標準輸出並且把錯誤重導向到一個檔案:
ls –R /shared >/dev/null 2>errors
 
這表示標準輸出將會被重導向(>)到/dev/null,一個你寫入任何東西都會消失不見的特別檔案(也就是副作用是標準輸出不會被顯示出來),而標準錯誤通道(2)則被重導向(>)到errors這個檔案。
管線在某方面是輸入和輸出重導向的一種組合。從名稱上來說,管線的原則是:一個行程傳送資料到管線的一端而別的行程從另一端讀取該資料。管線的運算子是「|」。讓我們回到上述檔案明細的例子。假如你想要直接地知道有多少符合要求的檔案而不想把明細放在一個暫存檔裡面,然後你可以使用如下的指令:
ls images/*.gif | wc –l
 
這表示ls指令的標準輸出(也就是檔案明細)被重導向到wc指令的標準輸入。然後這會帶給你想要的結果。
你也可以用下列的指令把「沒有延伸檔名」的檔案明細直接地放在一塊:
ls images/*.gif | sed –e ‘s/\.gif$//g‘ >the_list
 
或者,假使你想要直接地查閱明細而不把它放進一個檔案裡:
ls images/*.gif | sed –e ‘s/\.gif$//g‘ | less
 
管線和重導向並非僅僅被限制用於人們所讀得懂的文字檔上而已。舉例來說,在xterm裡輸入了接下來的指令:
xwd –root | convert - ~/my_desktop.gif
 
將把你的桌面拍下來並存到你個人目錄my_desktop.gif[2]檔案裡去。
它們被適當地規劃過),例如less或文字檔編輯程式如VI,當你想到時都可以把它們回復到前景來。
備註:
[1] 你可能會想說用『以.gif結尾的檔案』字眼而非『GIF影像檔』是件愚蠢的事。然而再一次提醒你,傳統上Unix底下的檔案只有一個延伸檔名;而延伸檔名並沒有辦法定義檔案類型。一個以.gif結尾的檔案可能是個完整的JPEG影像檔,一個應用程式檔案,一個文字檔或是任何其他的格式。
[2] 是的,它真的是GIF影像檔:-)
2.5. 自動補齊 ( Completion )
自動補齊是一個非常便利的功能,而所有的現代shell(包括Bash)都擁有它。它的角色是儘可能地給予使用者一點點工作上的幫助。而說明自動補齊的最好方法就是舉個實例。
假如你的個人目錄有個名叫file_with_very_long_name_impossible_to_type的檔案,而且你想要檢查它一下。又假設你在相同的目錄裡有另一個檔案叫做file_text。你正身處於你個人的目錄。因此你以底下的順序鍵入:
$ less fi
(也就是輸入less fi然後按TAB鍵)。接著shell將會為你擴充指令行:)
$ less file_
 
以及給你一個可能選擇的明細(根據它預設但可自訂的設定值)。然後輸入如底下順序的按鍵:
$ less file_w
 
那麼shell就會擴充這指令行而給你所想得到的結果:
less file_with_very_long_name_impossible_to_type
 
接下來你所要做的全部事情只是按下Enter鍵來確認並讀取這個檔案就行了。
即使是最一般的作法,TAB鍵並不是用來啟動自動補齊功能的唯一選擇。就普遍性的規則而言,被完成的字詞對指令行的第一個字詞來說會是一個指令的名字(輸入nsl將會給你nslookup),而其餘的全部都是用檔名來代表,除非這字詞的開頭是來自~、@或$這三個「魔法」字元其中之一,在這種情形下,shell會試著個別用使用者名稱、機器名稱或環境變數名稱[1]來自動補齊。會自動補齊的還有指令名稱(!)或檔名(/)這些個魔法字元。
其餘二個啟動自動補齊的方法依序是Esc-和C-x (Esc是指Escape鍵而C-x是Control+的意思),在這邊係指已經被提過的魔法字元中的一個。Esc-會嘗試提供個唯一的自動補齊目標,要是它失敗的話就會用可供選擇明細裡有著最大可能性的字串來自動補齊該字詞。「嗶」的一聲所表示的要不是這個並非是唯一的選擇,就是相當簡單地沒有任何符合需求的選擇。接著的C-x 則會顯示可能的選擇明細而不試圖去自動補齊些什麼。按TAB鍵和連續地按Esc-和C-x 是相同的,這裡的魔法字元取決於上下文。
至此,一個能夠看到所有已定義環境變數的方法是在空白行上依序鍵入C-x $。另一個例子:如果你想要看到nslookup指令在參考手冊裡每頁的內容,你只要鍵入man nsl然後按下Esc-!,這樣shell就會自動地用man nslookup來補齊。
備註:
[1] 記住:對Unix而言大小寫是不同的。HOME及home環境變數並不一樣。
2.6. 開始與處理背景行程:工作控制
當你用終端機輸入一個命令,你將會注意到在shell交還控制權前通常你必須等待指令的完成:你在前景(foreground)執行指令。然而,這也會有並不盡如人意的場合。
舉例來說,假如你決定遞迴複製一個極大的目錄到另一處。你也決定要忽略錯誤,因此你將錯誤通道重導向至/dev/null:
cp –R images/ /shared/ 2>/dev/null
 
像這樣子的一個指令要花費數分鐘來完成。然後你有二個解決方案:第一個是暴力的,而這意指停止(扼殺)這指令然後等你有空時再做一次。要這麼做的話,輸入C-c(Control+c):這將會讓你回到提示符號。
不過假使你想用這指令執行時來做其他的事,那麼解決方案就是把該行程給切換到背景(background)去。要這麼做,鍵入C-z來暫停這行程:
$ cp –R images/ /shared/ 2>/dev/null
# 在這裡按下C-z
[1]+  Stopped                                     cp –R images/ /shared/ 2>/dev/null
$
 
此時你再度回到了提示符號。然而行程正在待命中,等著你再次啟動它(就如同關鍵字Stopped所示)。那麼,當然啦,就如你所想要做的,它要被放到背景去。輸入bg(也就是BackGround)來得到你所渴望的結果:
$ bg
[1]+ cp –R images/ /shared/ 2>/dev/null &
$
 
然後這行程會再度以背景作業的身份,如同行末這個&符號所說明的一樣來開始執行。接著你就可以回到提示符號並且能夠繼續工作。一個以背景作業方式執行或者在前景的行程就稱為一個工作。
當然,你可以直接地以背景作業方式啟動行程,正確來說是在指令結尾加上一個&。因此,例如你可以用這方式在背景開始複製目錄:
cp –R images/ /shared/ 2>/dev/null &
 
要是你願意的話,你也可以輸入fg(ForeGround)來把這行程回復到前景並等待它完成任務。要再一次將它放入背景的話,請依序鍵入C-z,bg。
你可以用這個方法啟動一些工作:每一個指令將被給予一個工作編號。而shell指令jobs會列出所有與目前shell結合的工作。前面有「+」符號的工作表示後面的行程是用背景作業方式來開始執行。要把一個特定的工作回復到前景的話,那麼你可以鍵入fg ,這邊的是指工作編號,例如fg 5。
該注意的是你也可以用這方法來中止或啟動「全螢幕」應用程式(假使它們被適當地規劃過),例如less或文字檔編輯程式如VI,當你想到時都可以把它們回復到前景來。
2.7. 最後的叮嚀
如你所見,shell的功能十分完整而有效率地使用它則是練習的最佳理由。在這個較長篇大論的章節中,我們只談到少數可用的指令:Linux-Mandrake有著數以千計的公用程式,而甚至是最有經驗的使用者最多也使用一百個程式而已。
這裡有可以用在各式各樣喜好及用途的公用程式:你有關於影像處理的 (如同上面提到的convert,但也可以用「批次」(batch)模式的GIMP及所有的pixmap處理程式),聲音的(MP3解碼程式,音樂CD播放程式),CD燒錄的公用程式,e-mail程式,FTP客戶端程式和甚至是web瀏覽器(lynx或w3m),更別提所有的管理工具。
即使擁有相同功能的圖形應用程式確實存在,它們通常是在這些相同的公用程式上再建構一個圖形介面;除此之外,指令行公用程式有著能夠在非交談模式中操作的優點:你可以開始燒錄CD然後登出系統而確信燒錄作業會百分之百執行(參見nohup參考手冊)。
第十二章 命令列工具程式
目錄12.1grep(General Regular Expression Parse): 文字通用規則剖析
12.2find: 依照設定的準則找出檔案
12.3crontab: 向使用者提出報告或編輯crontab檔
12.4at: 命令排程,但只能執行一次
12.5tar: 錄製備份
12.6bzip2和gzip:壓縮程式
12.7還有很多其他的指令
這一章要介紹一些常用的命令列工具程式,當然如果你只用圖形化環境,可以略過這一章,但是很快的略過一眼,你會改變看法的。
本章內容並沒有特別的安排過,工具程式依照常用的程度列出,每個指令都以實例介紹常用用途,但指令中其他更有用的功能,限於篇幅,就留給你當作練習啦。
由於取第一個字母命名,從字面很難瞭解他是做啥用的,還好使用上不難,用來在一個或多個檔案中,尋找規定的字串。
他的語法是:
grep [選項] <尋找的字串規則> [一個或多個檔案]
如果尋找多個檔案,檔案名稱將會出現在找到這個字串的每一行前面,以-h選項不要顯示檔案名稱,以-l選項顯示有此字串規則的檔案名稱。用grep <字串規則> <檔案名稱>加上殼程式迴圈的小技巧,來瀏覽檔案非常好用,尤其是在選項多的列表。字串規則是一個規則的邏輯表示式(expression),雖然多數時候只是一個字。最常用的選項有這些:
1. -i: 區分英文字母大小寫的搜尋。
2. -v: 反向搜尋,顯示與規則不符的行數。
3. -n: 顯示找到的行號。
4. -w: 必須整個字跟字串規則相符才算。
下面是一些使用的實例:
$ cat victim
Hello dad
Hi daddy
So long dad
# 尋找字串 "hi",不管大小寫
$ grep -i hi victim
Hi daddy
# 尋找"dad",並把它當作一整個英文單字,而非英文單字的一部份,然後在
# 顯示每個符合的地方,並在前面標上行號
$ grep -nw dad victim
1:Hello dad
3:So long dad
# 尋找不以"H"開頭的每一行
$ grep -v "^H" victim
So long dad
$
在管線中使用grep,不用設定檔名,預設擷取標準輸入丟進來的東西,同樣的結果也是從標準輸出印出,所以可以將grep的輸出送到其他的程式,例如:
$ cat /usr/doc/HOWTO/Parallel-Processing-HOWTO | grep -n thread | less
12.2 find: 依照設定的準則找出檔案
find是一個歷史悠久的Unix工具程式,能夠遞迴掃描一個或多個目錄,尋找合乎特定準則的檔案,雖然有用,語法不複雜,但要用的好要花點功夫,通用的語法是這樣的:
find [選項] [目錄][準則][動作]
如果沒有定義目錄,find預設搜尋現行目錄;如果沒定義準則,則假設等於真,就會顯示所有的檔案;選項、準則和動作的設定很多,在這裡每一個東西只選幾個重點提一下,先討論選項:
1.     -xdev: 不要搜尋在其他檔案系統的目錄。
2.     -mindepth : Descend at least 找到檔案前最少搜尋現行目錄以下層的目錄。
3.     -maxdepth : 最多搜尋現行目錄以下層。
4.     -follow: 如果符號連結連到目錄,進入到那個目錄內,繼續進行搜尋,find預設不追蹤到連結的目錄。
5.     -daystart: When using tests related to time (see below), take the beginning of current day as a timestamp instead of the default (24 hours before current time).
準則是一個或多個不同的小檢查規則,以下列出一些常用的檢查規則:
1.     -type <型態>: 尋找特定型態的檔案; <型態>有下列幾種 f (普通檔案), d (目錄), l (符號連結), s (socket), b (區塊模式檔案), c (字元模式檔案) or p (命名的管線).
2.     -name <特徵字串>: 尋找檔名與所給的 <特徵字串>相符者,使用這個選項,<特徵字串>被視為shell globbing pattern (參考章節shell globbing patterns and regular expressions).
3.     -iname : 與 -name相似,但不管英文字母大小寫。
4.     -atime , -amin : 搜尋最近一次存取是 天以前(-atime)或 分鐘以前 (-amin)。也可以定義+或-, 搜尋最多或最少天或分鐘存取過的檔案。
5.     -anewer <檔案名稱>: 尋找最近一次存取時間比 <檔案名稱> 最後一次存取時間還晚的檔案。
6.     -ctime , -cmin , -cnewer <檔案名稱> 用法與-atime, -amin 及 -anewer相同,但所參考的時間為最後一次檔案內容更改的時間。
7.     -regex <特徵字串>: 與-name用法相同,但特徵字串視為普通的表示式。
8.     -iregex <特徵字串>: 與 -regex用法相同,但忽略大小寫。
還有許多的檢查規則,請參考線上手冊。可以下列方式合併檢查規則:
1. -a: <1>和<2>為真則為真,-a是預設值,因此當要多個測試同時滿足方為真時,可以鍵入<1><2><3>....。
2. -o: <1>或<2>為真則為真,-o的運算優先順序比-a後面,如果要比較符合準則時,必須利用括弧寫成( -o ) -a ,必須溢出括弧,否則他們會被殼解譯成殼命令。
3. -not : 反相測試,因此如果為假則-not 為真。
最後討論如何對每個找到的檔案,定義一個動作,最常使用到的是:
1. -print: 將所有檔名在標準輸出印出來,如果未做任何設定,此為系統預設值。
2. -ls: 將所有找到的檔名以ls -ilds的格式在標準輸出印出來。
3. -exec <指令名稱>:在每個找到的檔案執行指令<指令名稱>,命令列的指令必須以";"結尾,才能不被系統殼的解譯,檔案的位置要以{}標註,請參考使用範例。
4. -ok <指令名稱>: 和-exec相同,但每個指令都會要求確認。
沒睡著吧?現在舉一些實例來幫助我們瞭解這個怪物,首先找出在/usr/share中所有的目錄,請鍵入
find /usr/share -type d
假設有http伺服器,所有的HTML檔案放在/home/httpd/ html,這個目錄也是現行目錄,想找出一個月以上沒有更改的檔案,當網頁由好幾個人負責更新,附檔名有一部份是html,一部份是htm,並把找出的檔案連結到/home/httpd/ obsolete目錄中,請鍵入
find \( -name "*.htm" -o -name "*.html" \)  -a -ctime -30 \
-exec ln {} /home/httpd/obsolete \;
[1]
這個例子是有點小複雜,需要一些解釋,它的搜尋準則是:
\( -name "*.htm" -o -name "*.html" \)  -a -ctime -30
上面這段準則,找出附檔名htm或html的檔案\( -name "*.htm" -o -name "*.html" \),並且在最近30天內,未做任何更動者,而30天差不多是一個月(-ctime –30)。請注意因為-a要先執行,所以括弧是必要的!如果沒有括弧,找到的結果將為所有副檔名為htm的檔案及副檔名為html且最近一個月未經修改的檔案,這不是我們所要的結果。 同時要注意括弧會從系統殼跳出,如果以(..)代替\(..)\,系統殼會解譯他們然後嘗試在次系統殼執行- name ”*.htm” -o -name ”*.html。 另一個方法是把括弧放在雙引號(“”)或單引號(‘’)之間,但是在這裡使用反斜線,只要一個字元會比較簡單。
最後是在每個符合條件檔案執行的指令:
-exec ln {} /home/httpd/obsolete \;
同樣的在這裡,要使用分號前要加上反斜線跳出系統殼,否則系統殼會將分號視為指令分隔運算子,find會產生-exec沒有參數的錯誤訊息。
最後一個例子:有一個各式影像檔的大目錄/shared/images,平常以touch指令更新目錄中stamp檔案的日期,作為時間的參考。在這裡要找出所有比stamp的檔案日期新的檔案,並由於影像檔來源不同,有jpg, jpeg, JPG或JPEG等型態的副檔名,同時不比較在old目錄中的檔案。最後將這些檔案的清單,以電子郵件寄給使用者john。
find /shared/images -cnewer     \
/shared/images/stamp       \
-a -iregex ".*\.jpe?g"     \
-a -not -regex ".*/old/.*" \
| mail john -s "New images"
這就是我們要的結果了,當然如果這麼長的指令,每次都要自己在電腦上敲,是沒啥用的,如果系統可以定期自動執行,才合乎我們的實際需求,接下來就告訴你怎麼做。
備註:
[1]
註:這個例子/home/httpd和/home/httpd/obsolete必須在同一個檔案系統。
12.3 crontab: 向使用者提出報告或編輯crontab檔
crontab可以固定時間間隔執行一組指令,同時使用者無須登入系統,並將執行的結果以電子郵件通知下指令的人,在這裡時間間隔可以分鐘,小時,日及月等時間單位設定,依據不同的選項,crontab執行的方式也不同:
1.     –l: 印出使用者現行的crontab檔。
2.     –e: 編輯使用者的crontab檔。
3.     –r: 移除現行的crontab檔。
4.     –u <使用者帳號>: 對特定使用者執行前面的crontab指令,但這個選項只有超級使用者root可以用。
首先從編輯crontab檔案開始,如果沒有更改EDITOR或VISUAL環境變數,執行crontab –e後,將會出現VI這個系統預設文字編輯器。在crontab檔案中,每一行分做六個部分,前五個部分分別設定時間間隔為分鐘、小時、一個月中的哪幾天、哪幾個月及一星期的哪幾天;第六個部分是要執行的命令。行首為#者,被crond(執行crontab內容的系統程式)視為註解,不予執行,接下來是一個crontab檔案的例子:

註:為了增加可讀性,必須將內容過長的行換行,但實際上必須在同一行,當行尾以/作為結尾,表示這一行與下一行內容實際上是同一行。這個表示方式將同時被使用在Makefile及系統殼中,以及後續其他的內容。
#   如果不想將結果寄出電子郵寄就在後面這行首加上#
#MAILTO=""
#
#   依照前一節的例子,每兩天的下午兩點報告新的影像檔列表,
#   然後重新touch stamp這個檔案,更動其檔案時間。%符號代表
#   新的一行,可以將好幾個指令放在同一行。
0 14 */2 * *  find /shared/images              \
-cnewer /shared/images/stamp                 \
-a -iregex ".*\.jpe?g"                       \
-a -not -regex                               \
".*/old/.*"%touch /shared/images/stamp
#
# 每當聖誕節就放音樂 :)
0 0 25 12 * mpg123 $HOME/sounds/merryxmas.mp3
#
# 每星期二下午五點,印出購物清單...
0 17 * * 2 lpr $HOME/shopping-list.txt
除了前面範例中的方式外,還有很多其他的方法可以設定時間間隔,例如可以逗號分隔定義乙組不同數值的組合(1,14,23)或一個連續範圍(1-15),甚至兩者的組合(1-10,12-20),或其中幾個範圍內取固定時間間隔(1-12,20-27/2)。現在就看你怎麼去組合指令放進去,做出有用的功能。:-)
12.4 at: 命令排程,但只能執行一次
有時想在特定的時間點執行指令,例如希望系統提醒你在今天下午六點的約會,現在你正在執行X視窗,希望五點半時系統提醒你,該去赴約了,在這at指令就發揮作用了:
$ at 5:30pm
# 現在會出現 "at" 的提示符號
at> xmessage "該走了! 六點有個約會!"
# 按 Ctrl-d 離開
at>
$
有幾種不同的方式定義時間:
1.     now +<時間間隔>:從現在時間再加上時間間隔(可以選擇性加入的選項,沒有代表現在)後的時間,時間間隔的語法是 (minutes/hours/days/weeks/months),例如可以定義now + 1hour, now + 3 days等。
2.     <時間> <日期>: 定義特定的年月日時。<時間>是必要參數,所接受格式非常的自由,例如0100, 04:20, 2am, 0530pm, 1800或下面三個關鍵字noon, teatime(4pm)及midnight。<日期>是一個選擇性的參數,也有多種的定義方式,例如12/20/2001代表2001年十二月廿日,或者以歐洲的表示方式20.12.2001也可以,同時歐洲的表示方式可以省略年如20.12,又月也可以英文縮寫代替如Dec 20或20 Dec都可以。
at同時也有一些選項可以設定:
1.     –l:印出目前正在排序的工作,第一個部分顯示的是工作的序號,跟atq指令的功能相同。
2.     –d :移除序號的工作,工作序號可以atq或at -l指令取得,跟atrm 的功能相同。
同樣參考man 1 at線上手冊,可以找到更多的選項。
12.5 tar: 錄製備份
雖然已經在建立及安裝自由軟體那一章提過tar的使用,但在這一節將解釋tar的工作原理。跟find一樣,tar是一個歷史悠久的Unix公用程式,因此語法上有點特殊:
tar [選項][檔案名稱……]
接下來是選項的列表,所有的選項都以單一字母表示,同時也有相對應的完整選項名稱,但在這裡將不列出,請自行參考線上手冊,當然在這也不會列出所有的選項。:-)

註:tar中的選項縮寫之前不用加-,除非是使用完整選項名稱,才需要在選項前加上-。
1.     c:製作新備份檔。
2.     x:解開備份檔。
3.     t:列出備份檔中檔案列表。
4.     v:列出備份檔中檔案簡單列表,或同時加上t選項,將列出檔案的詳細列表。
5.     f <檔案名稱>: 產生以<檔案名稱>為檔名的備份檔、由備份檔中解出檔案或列出備份檔中的檔案。如果加上<檔案名稱>這個參數,預設值是/dev/rmt0,這是代表streamer的特殊檔案名稱;如果以-代表<檔案名稱>參數,則指令的輸入或輸出將被連接到標準輸入或輸出。
6.     z:以gzip壓縮備份檔,或以gzip解壓縮備份檔。
7.     y:與z類似,但以bzip2壓縮。
8.     p:解開備份檔時,保持所有原始檔案屬性,如擁有者,最後存取時間等,在檔案系統備份時很有用。
9.     r:將命令列上所提供的檔案列表,新增入備份檔中,但這個備份檔不能為已壓縮者。
10. A:將命令列上所提供的備份檔案列表,新增入f選項指定的備份檔,與r選項相同備份檔皆不能為已壓縮者。
還有很多其他有用的選項,有興趣請自行參考man 1 tar,舉例來說d這個選項,如果想備份在/shared/images中所有的影像檔,並以bzip2壓縮,以images.tar.bz2作為檔名放在家目錄中,請鍵入:
#
# 註:必須進入想要備份的檔案所在目錄中執行指令。
#
$ cd /shared
$ tar cyf ~/images.tar.bz2 images/
在上面使用了個參數:c要tar產生一個備份檔,y要求使用bzip2壓縮,及f -/images.tar.bz2設定備份檔以images.tar.bz2檔名放在我們的家目錄中。接下來想檢查備份檔內容是否正確,以列出其中檔案的方式確認:
#
# 回到自己的家目錄
#
$ cd
$ tar tyvf images.tar.bz2
以參數t要求tar列出備份檔中的檔案,並以f指定備份檔名為images.tar.bz2,同時以y警告tar備份檔由bzip2壓縮,最後以v要求列出檔案完整列表。
如果不小心殺掉影像檔的目錄,幸運地已經做了備份,希望備份檔解壓縮放回原來/shared目錄之下,但又不讓find指令將這些還原的檔案視為新檔案,所以要以p保留所有檔案的檔案屬性:
#
# 進入要解壓縮的那個目錄
#
$ cd /shared
$ tar yxpf ~/images.tar.bz2
大功告成!現在試著僅將images/cars從備份檔中解出來,請鍵入:
$ tar yxf ~/images.tar.bz2 images/cars
在某些狀況,備份特殊檔案時,會憂慮tar以檔案原始內容解出造成錯誤,不要擔心,可以放心將/dev/mem放在備份檔中,tar會自動處理連結等問題,對於符號連結,請參閱線上手冊的h選項。
12.6 bzip2和gzip:壓縮程式
已經在前一節談tar時提過這兩個壓縮程式,不像Wndows下的Winzip由一個程式同時處理備份及壓縮的工作,tar處理備份,而bzip2及gzip則負責壓縮。
bip2為了取代gzip而發展的,壓縮比較高但吃記憶體吃得比較凶。而gzip因為已經被廣泛使用很久了,所以至今尚未被 bzip2所取代,或許未來可能會也可能不會有機會。
兩個壓縮程式有近似的語法:
gzip [選項] [檔案名稱]
如果沒有給檔案名稱,gzip及bzip2都會等著由標準輸入取得資料並將結果送到標準輸出,因此可以在這兩個程式使用管線,兩個程式也有一些相同的選項:
1.     –1,….,-9: 設定壓縮比,數字越大,壓縮比越高但同時也就越慢,天下沒有白吃的午餐。
2.     –d: 解壓縮檔案,等於使用gunzip或bunzip2。
3.     –c: 傾印命令列壓縮或解壓縮檔的結果到標準輸出。
請注意!如果沒有使用-c選項,gzip及bzip2在壓縮完成後會刪除原始檔案,在bzip2可以使用-k選項防止,但gzip就沒辦法啦!
接下來以幾個例子作為說明,首先將所有現行目錄中,副檔名為txt的檔案案以bzip2壓縮:
$ bzip2 -9 *.txt
若想與某人分享影像檔的備份,但他只有gzip,無須將檔案解壓縮再重新壓縮,只要解壓縮到標準輸出,利用管線,由標準輸出壓縮轉向輸出成新的備份檔:
bzip2 -dc images.tar.bz2 | gzip -9 >images.tar.gz
此外可以bzcat代替bzip2 –dc,gzip也可以使用同樣的用法,但為zcat而非bzcat。如果要直些看壓縮檔中的檔案內容,也可以用bzless(gzip則用zless),則無須先解壓縮了。試著找出除了bzless(zless)外的指令,能看壓縮檔中的檔案內容,而無須解壓縮,作為一個練習:-)
12.7 還有很多其他的指令
還有很多其他的指令,如果要以一本書來討論,可以寫出像百科全書這麼厚的書,本章的所提內容不到全部的十分之一
,雖然從這裡學到的東西,已經可以做很多事情了。如果有興趣,可以讀一些獻上手冊如man 1 sort, man 1 sed, man 1 zip(你可能猜出來了,我們可以用linux來製作或解壓縮ZIP的備份檔), man 1 convert等等。熟練這些工具指令的方法就是不斷的練習和嘗試,就會發現到他們的很多用途,甚至是你想都沒想過的,好好享受學習的樂趣:-)
Linux 系統管理入門課程教材
國家高速網路與計算中心 自由軟體實驗室
蕭志榥
第一部份 - UNIX, Linux簡介以及基本指令與操作,編輯器,shell,檔案系統,指令與正規化表示式(Regular Expression)簡介
線上 (Html 格式)、下載(PDF 格式)補充 (Html 格式)Linux指令參考 (Html 格式)
第二部份 - 網路概論與Linux網管
線上 (Html 格式) 、設定網路步驟
第三部份 - Linux安裝實做,程式套件的安裝與維護,核心編譯
線上(HTML 格式)、下載(PDF格式)Debian 無痛起步 (mirror)原始網頁安裝Debian Linux所需之image相關網頁Debian參考手冊 (Html 格式)
第四部份 - 伺服器安裝與設定
線上Apache,Samba,wuftpd andmail (HTML格式)
其他 - 課堂中筆記 (HTML 格式) (過去課程的筆記)
本網頁由國家高速網路與計算中心 陳郁中,林昀德,黃國連,王順泰,柯森與蕭志榥提供相關資料
NCHC Free Software Labs
from: http://opensource.nchc.org.tw/intro_to_linux/