在經過上機操作實踐以及掌握Unix系統相關的基礎知識之後,可以說已跨進了邁向成功的門檻。接着要登堂入室,繼續專進,就必須更加深入的瞭解Unix基本命令的功能、使用並掌握一些必備的技巧。這一輪學習會有一定難度,需要強烈的求知慾和進取心作爲源動力,因爲只有“不滿足纔是向上的車輪”;同時也需要注重學習方法,善用前人總結的“約取而實得”的經驗,巧學精進,迎難攻解,從而達到再上臺階之成效。
一、文件系統的相關命令
佛教《百喻經》中有一則三重樓的喻裏,說有一個財主,見到他的鄰居蓋房子,三層樓蓋得很漂亮,他也要蓋這樣的三層樓房子。見工匠在做地基,他就說不要地基,要直接蓋第三層樓,因爲第三層最高最漂亮。我們都會覺得這個財主很可笑,但在學習知識的過程中,我們可別老想着第三層而忽視打好地基噢!
文件系統相關的命令是操作Unix系統的基礎,在《Unix操作系統的入門與基礎》一文中我們曾使用過其中的部分命令,下面就再來仔細學習這些命令的使用,繼續打好今後蓋“三層樓”的“地基”吧。
(一)目錄管理
我們可以通過使用mkdir、rmdir與cd命令來創建、刪除目錄以及改變工作目錄,並通過ls命令列表顯示目錄內容,以達到對目錄的有效管理。
(1)mkdir命令的功能是創建目錄,並且可同時創建多個目錄,格式如下:
mkdir [-p] directory-name(s)
參數p代表在建立指定目錄時,如果其父目錄不存在,則一同創建。
[例]
mkdir dir1 dir2 dir3 //在當前目錄下建立目錄dir1、dir2、dir3
mkdir dir1/dir4 //在當前目錄下的dir1子目錄中創建目錄dir4
mkdir –p dir6/dir7 //在當前目錄下,由於不存在dir6目錄,則先自動創建目錄dir6,
//然後創建其子目錄dir7
(2)rmdir命令的功能是刪除目錄,但其只能刪除空目錄(即目錄中不包含文件),故此命令一般較少使用,在後文中會介紹一個更爲常用的刪除目錄命令。rmdir命令的格式如下:
rmdir directory-name(s)
(3)在進行處理文件等的操作過程中難免需要在不同的目錄下工作,這時cd命令就能派上用場了。cd命令的功能是改變當前的工作目錄,它的命令格式如下:
cd [directory-name]
cd後面的目錄可以是絕對路徑,也可以是相對路徑。如果cd後面不跟路徑名,則是回到用戶的主目錄。如果大家對此處的一些概念不甚熟悉的話,請參見《Unix操作系統的入門與基礎》文中的介紹,此處就不再贅述了。下面來看幾個例子:
cd dir1 //進入當前目錄中的dir1子目錄
cd .. //進入上級目錄,即把工作目錄改變成當前目錄的父目錄
cd ../zcl //回到父目錄,同時再進入zcl子目錄中
(注:上述三個命令的路徑都爲相對路徑)
cd /home/anray //把工作目錄改變成根目錄中的home目錄下的anray子目錄
(注:此處路徑爲絕對路徑)
此外,使用pwd 命令可以查看當前的工作目錄,它顯示的是當前工作目錄所處的絕對路徑。
(4)ls命令的功能是列表顯示指定目錄中文件及子目錄的信息(其實在Unix系統中目錄本身也被視爲一個文件,但是爲了照顧習慣的思維,在敘述時仍然將其區分爲文件與目錄兩類),缺省輸出順序爲縱向按字符順序排列。它常用的命令格式如下:
ls [-altFR] [directory-name]
參數a代表顯示所有類型的文件,包括文件名以“.”爲第一個字符的隱藏文件。參數t代表按文件最後修改時間的順序依次排列文件,參數R將會列出指定目錄下以及其所有子目錄中的文件,使用參數F將會在列表中的每一個目錄後面加上“/”,在每個可執行文件後面加上“*”。參數l代表長列表顯示目錄內容,即列出文件的類型、訪問權限、擁有者、文件大小、修改時間及名稱等詳細信息。下面將介紹一下長列表顯示中的信息的含義,“ls –l”命令的使用如下圖所示。
在上圖長列表顯示文件信息的每一行中,
第一列
|
第1個字符表示文件的類型;
第2-4個字符表示文件所有者對此文件的訪問權限;
第5-7個字符表示用戶組對此文件的訪問權限;
第8-10個字符表示其他用戶對此文件的訪問權限;
|
第二列
|
文件的鏈接數
|
第三列
|
文件的所有者
|
第四列
|
文件的用戶組名
|
第五列
|
文件所佔的字節數
|
第六至八列
|
文件上一次的修改時間
|
第九列
|
文件名
|
注:此表格中的一些概念在下文會有詳細介紹,這裏只需先了解一下即可
|
(二)文件管理
1、文件的創建、編輯與刪除
Unix系統中可以使用touch命令來創建新文件,它的命令格式如下:
touch filename(s)
但要指出,touch命令最常用的功能並不是創建文件,而是改變指定文件(或目錄)的最後訪問時間和修改時間。它的命令格式如下:
touch [-am] [mmddhhmm[yy]] filename(s)
此命令中,若指定文件不存在,則創建之;若已存在,則將指定文件的訪問時間和修改時間按參數的要求進行改變。參數a代表只改變訪問時間,參數m代表只改變修改時間。參數mmddhhmm[yy]中每隔兩位分別表示“月日時分[年]”,用戶可利用此參數指定欲設置的時間,若不帶此參數,則會自動使用系統當前的默認時間。
[例] 在當前目錄下創建新文件document:
touch document
將剛創建的文件document的訪問與修改時間改爲2005年10月1日0時0分:
touch -am 1001000005 document
大家可不要小視touch命令的此項作用,在軟件的實際開發中,有時它還會與企業的客戶關係管理策略或企業經濟效益密切關聯。倘若你所在企業的開發團隊協作精神好,工作效率高,或者是改進了相關技術與流程,使原與客戶合同中約定的項目完成日期大大提前,爲了屏蔽用戶知情,避免節外生枝,該命令就派上大用場了。這事我知你知即可,彼此只能心照不宣噢!
文件創建好之後就需要對此文件的內容進行相應的編輯了,在Unix系統中最常使用的編輯工具是vi,在後文中會有專門的章節進行詳細介紹,此處先行略過。
在使用Unix系統一段時間之後,大家可能會發現文件數量正在快速增加,而其中的一部分文件可能已經變得過時,或是沒有了使用價值,這時就應該及時利用rm命令將此類文件刪除了。rm命令的功能是刪除文件或目錄,它的命令格式如下:
rm [-i] filename(s)
或 rm –r[i] directory-name(s)
使用參數i的目的是給大家一次“買後悔藥”的機會。由於Unix系統中的文件一旦刪除將極難恢復,因此在刪除文件之前一定要慎重。而參數i的作用是在刪除文件之前進行逐一詢問提醒,是否確實要刪除此文件。如果輸入y則刪除文件,若輸入其他字符,文件則會被保留。使用了帶參數r的rm命令可用來刪除一個目錄以及其所有子目錄,此時不必受刪除目錄必須爲空目錄的條件限制,因此也就更具危險性,大家在使用前應當慎之又慎。
[例]
rm doc1 doc2 doc3 // 直接刪除文件doc1、doc2、doc3
rm –i doc1 doc2 doc3 //在刪除文件doc1、doc2、doc3時,每刪除一個之前先作提示
rm -ri dir1 //刪除目錄dir1以及其中所含的所有文件與子目錄,刪除前先作提示
2、文件的查看
常用的查看文本文件的命令有cat、more、head、tail等,下面將逐一進行介紹。
(1)cat命令可以在屏幕上顯示出文本文件的內容,它的命令格式如下:
cat filename(s)
不過cat最常見的用法是配合重定向符來清空文件以及將幾個文件合併成爲一個文件。重定向符的詳細用法請參見本文第二章節的內容。
[例]
cat /dev/null > doc.txt //清空文件doc.txt,/dev/null代表空設備文件(記住使用即可)
cat < doc1.txt >> doc2.txt //將doc1.txt中的內容保存在doc2.txt的尾部
(2)使用cat命令查看文本文件時會有一個問題,就是它不會分屏顯示文件,這樣當文件的內容超出一屏時,除了最後一屏的內容之外,上面的內容都將是一閃而過。當然解決的辦法Unix也替我們想好了,就是使用more命令來查看此類文件。more命令的格式如下:
more filename
more命令將會以分頁的方式顯示文本文件內容。當每次將文件內容顯示在屏幕上時,如果內容超出一屏,則會在屏幕的左下部顯示“ --more--”,並且在其後面顯示百分比表示已顯示部分佔總內容的比例。此後按回車鍵則會下滾一行,按空格鍵則會下翻一屏,按“b”字母鍵可以返回上一屏,按“h”字母鍵可以獲得關於更多功能的幫助;使用“/”加上字符串可以查找指定字符串的內容信息,找到後可以按“n”字母鍵繼續搜索下一個符合要求的內容信息,按“q”字母鍵則可退出並返回Shell命令提示符狀態。
(3)head & tail 命令
head與tail命令的格式如下:
head [-n] filename(s)
tail [-n] filename(s)
head命令的功能是顯示一個或多個文件開頭n行的內容,tail命令的功能是顯示一個或多個文件最後n行的內容。若沒有指定參數n,則系統會默認顯示10行內容。
(三)文件與目錄的訪問權限
1、文件訪問權限簡介
在Unix系統中每個文件(或目錄)都包含有一套權限,這些權限決定了誰能訪問該文件以及如何訪問該文件。通常文件有三種權限:
權限
|
普通文件的權限
|
目錄的權限
|
r
|
讀取文件內容
|
讀取文件名稱
|
w
|
向文件寫入信息
|
建立和刪除文件,可以改變文件名等
|
x
|
執行文件
|
使用該目錄中的文件
|
在Unix系統中有三種不同的用戶類型,分別是所有者(owner)、用戶組成員(group)、其他用戶(other)。所有者是指文件的創建者;用戶組成員是指由若干個用戶組成的組內成員;而除所有者、用戶組成員之外的訪問者,統稱爲其他用戶。所有者除擁有相關的訪問權限外,還有向另兩類用戶授權之權限。用戶組中的成員在同組內可以共享信息,通常某一類或某一項目中的用戶會被Unix系統管理員歸爲一個用戶組,每個用戶都被授予能訪問同組成員文件的權限。其他用戶在所有者的授權下可對文件有讀、寫或執行的權限。
上文中我們曾提到使用“ls –l”命令來顯示文件的訪問權限。如圖中所示:
以文件myfile1爲例:
|
所有者
|
用戶組
|
其他用戶
|
權限
|
rw-
|
r--
|
r--
|
含義
|
可讀、可寫、不可執行
|
可讀、不可寫、不可執行
|
可讀、不可寫、不可執行
|
2、文件訪問權限的設置
使用chmod命令可以修改文件的訪問權限,chmod命令的格式分爲兩種:
格式1:chmod symbolic_mode file(s)
格式2:chmod absolute_mode file(s)
(1)格式1:符號模式(symbolic_mode)的命令格式如下:
chmod who op permission(s) file(s)
參數who表示用戶類型,它的內容爲以下一項或多項:
u
|
文件所有者
|
g
|
用戶組
|
o
|
其他用戶
|
a
|
所有用戶
|
參數op表示操作:
+
|
表示要增加permission指定的權限
|
-
|
表示要取消permission指定的權限
|
=
|
設置爲permission指定的權限,並取消原設置權限
|
參數permission爲權限類型,它的內容爲以下一項或多項:
r
|
表示可讀
|
w
|
表示可寫
|
x
|
表示可執行
|
[例] 以上圖爲例,要爲myfile1的所有者增加執行權限,用戶組增加寫權限與執行權限,取消其他用戶的讀權限,使用命令如下:
chmod u+x,g+wx,o-r myfile1 //爲不同用戶類型設置權限時用“,”分隔
(2)格式2:絕對模式(absolute_mode)的命令格式如下:
chmod xyz file(s)
參數x、y、z分別代表0-7的數字,用來表示所有者、用戶組、其他用戶對該文件的訪問權限。x、y、z所代表的0-7數字的含義如下:
Value
|
permission
|
7
|
r w x
|
6
|
r w -
|
5
|
r – x
|
4
|
r - -
|
3
|
- w x
|
2
|
- w -
|
1
|
- - x
|
0
|
- - -
|
[例] 用絕對模式來完成符號模式中的例子:
chmod 770 myfile1
從對比中大家應該感受到,符號模式會更加直觀一些,而絕對模式的數字含義較難記憶,因此設置文件權限時推薦使用符號模式。
(四)文件與目錄的移動複製
在Window系統中,我們最熟悉的操作應該莫過於“Ctrl + C”、“Ctrl + V”、“Ctrl + X”了,因爲它爲我們節省了大量的時間,帶來了極大的便利。而在Unix系統中同樣爲我們準備了cp、mv命令,利用它們可以實現剪刀加糨糊的操作了:)
1、移動或重命名文件(或目錄)
利用mv命令可以將一個文件(或目錄)從一個目錄移到另一個目錄中,也可以用於重命名一個文件(或目錄)。mv命令的格式如下:
mv [-i] source-file target-file
或 mv [-i] source-directory target-directory
當target-file爲文件名時,則相當於文件重命名,target-directory同理。參數i代表在將文件移動到指定目錄中時,若已存在同名文件,則將詢問是否覆蓋已存在的文件,輸入y則覆蓋,輸入其他字符則中止移動,保留原文件。
[例]
mv beans nuts //將文件beans重命名爲nuts
mv file1 file2 /tmp //將文件 file1和file2移動到目錄/tmp中
mv dir1 /export/home/anray // 將目錄dir1包括其所有文件與子目錄都移動到目
// 錄/export/home/anray下
// 錄/export/home/anray下
2、複製文件(或目錄)
利用cp命令可以將一個文件(或目錄)從一個目錄複製到另一個目錄中,命令格式如下:
cp [-i] source-file(s) destination-directory
或 cp –r[i] source-directory(s) destination-directory
參數i代表在將文件複製到指定目錄中時,若已存在同名文件,則將詢問是否覆蓋已存在的文件,輸入y則覆蓋,輸入其他字符則中止複製,保留原文件。當複製文件到指定目錄,或許會期望賦予此複製的文件不同於源文件的文件名,則只需將新文件名放在目標目錄名之後,用“/”隔開即可。當需要將一個目錄連同它的所有子目錄一起復制到目標目錄中時,可使用參數r。
[例]
cp beans apple //將文件beans複製到同目錄下並改文件名爲apple
cp beans apple dir1 //同時複製兩個文件beans與apple到當前目錄下的子目錄dir1中
cp apple dir2/orange //將文件apple複製到當前目錄下的子目錄dir2中,並改名爲orange
cp -r dir1 dir2 //將目錄dir1中的所有文件以及其所有子目錄複製到目錄dir2中
(五)其它常用命令
1、man命令
man命令用於查看幫助信息,常用的命令格式有:
man name
或 man –k keyword
[例]
man //查看man的使用方法
man ls //查看ls命令的幫助信息
在查看幫助信息過程中,按回車鍵則會下滾一行,按空格鍵則會下翻一屏,按“b”字母鍵可以返回上一屏,使用“/”加上字符串可以查找指定字符串的內容信息,找到後可以按“n”字母鍵繼續搜索下一個符合要求的內容信息,按“q”字母鍵則可退出並返回Shell命令提示符狀態。
2、clear命令
clear命令的功能是清理屏幕,每次操作Unix系統時間長了,屏幕上的信息難免顯得有些凌亂,這時clear一下是不是覺得眼前一下子“清靜”了許多:)
3、date命令
date命令的功能是顯示系統時間,並可修改系統時間。date命令的格式如下:
date [mmddhhmm[yy]]
date命令後若無參數,則會顯示系統當前的默認時間。若要修改系統時間,則輸入參數的順序依次爲“月日時分年”。如要將當前系統時間修改爲2005年10月1日0時0分,則可使用如下命令:
date命令後若無參數,則會顯示系統當前的默認時間。若要修改系統時間,則輸入參數的順序依次爲“月日時分年”。如要將當前系統時間修改爲2005年10月1日0時0分,則可使用如下命令:
date 1001000005
4、cal命令
cal命令的功能是顯示日曆。
[例1] 要查看2005年的全年日曆:
cal 2005
[例2] 要查看2005年5月份的日曆:
cal 5 2005
二、特殊字符的使用
先說一個事例:一次有位朋友問我有沒有辦法把某英語輔導軟件中加密的數據搞到手,我想也沒想,立刻翻箱倒櫃去找出各種解密工具。大半個小時後,正在我毫無頭緒之際,這位朋友跑來說自己已搞掂了這個軟件的使用授權。問他,說只是給軟件作者打了個電話。由此想到Unix中的一些特殊字符,往往平時操作中不曾想到去用它,而是墨守成規地進行自己所熟悉的步驟,實際上是在用那些老笨的方法。如能想到並熟知Unix中特殊字符的功能及使用技巧,就會像我這位聰明的朋友一樣取得事半功倍的效果。
(一)通配符的使用
文件名是命令中最常見的參數,大家可能經常會碰到這樣的情況,就是僅知道文件名的一部分,或者是想同時引用多個具有相同擴展名或以相同字符串開頭的文件。Shell中提供了一套被稱作通配符的符號,它們能搜索、匹配併產生一個文件名列表,通配符包括“*”、“?”、“[]”。用戶執行以包含通配符的文件名爲參數的命令之後,Shell會自動去搜索匹配文件並返回所發現的一個文件名列表,然後Shell就會用這些文件名作爲命令的參數了。
星號“*”用於指代以特定字符串開始或結束的文件名,問號“?”代表文件名稱中的單一字符,即“*”可替代文件名中任意長度的字符串,而“?”只能替代一個字符。方括號“[]” 的作用是使用戶確定所需搜索的有效字符集,任何在“[]”裏的字符都將被匹配。此外,在“[]”中可使用“-”來指定一個字符集範圍,這樣就不必手動的一個個列出來了。
請看下面的例子:
假設當前目錄下有8個文件doc1,doc2,doc3,docA,docB,docC,docD,document,分別對其進行如下操作:
ls doc* //顯示出doc1,doc2,doc3,docA,docB,docC,docD,document
ls doc? // 顯示出doc1,doc2,doc3,docA,docB,docC,docD
ls doc[13AD] // 顯示出doc1,doc3,docA,docD
ls doc[A-C] // 顯示出docA,docB,docC
ls doc[1-8] // 顯示出doc1,doc2,doc3
(二)命令分隔符“;”的使用
有時某些用戶可能想在一行中運行多個命令,那麼可以在這一行中輸入多個命令,命令間用“;”相隔,如:
mkdir tmp; cp file1 tmp/file2; ls -l tmp
Unix會順序執行以上三條命令,要注意的是在命令間使用分隔符“;”,只代表命令執行的先後順序。
(三)重定向符的使用
用戶欲執行一個命令,當然是要先輸入此命令,系統默認的標準輸入設備是鍵盤,而執行命令後的結果通常顯示在系統默認的標準輸出設備顯示器上。但是,Unix系統具有重定向功能,即將標準輸出重定向則可將命令的處理結果存入指定的文件,而非顯示在屏幕上;將標準輸入重定向則可把指定的數據文件作爲輸入源,而非從鍵盤輸入數據。
重定向符如下:
<
|
從一個文件或設備重定向輸入
|
>
|
重定向輸出到一個文件或設備,如文件不存在則創建該文件,如文件已存在則覆蓋該文件
|
>>
|
重定向輸出到一個文件或設備,並將輸出信息追加到已存在文件的尾部
|
例如:
cal 5 2005 > doc1.txt //將2005年5月份的日曆保存在文件doc1.txt中
cal 6 2005 >> doc1.txt //將2005年6月份的日曆保存在文件doc1.txt尾部
//此時文件doc1.txt中保存了5、6兩個月的日曆
cat < doc1.txt > doc2.txt //將doc1.txt作爲輸入源,把其中的內容保存在doc2.txt中
(四)管道符“|”的使用
有時可能會需要將一個命令的標準輸出發送給另一個命令使用,而非發送到一個目標文件,這時就需要使用Unix提供的管道符“|”在這兩個命令間架起一條連接管道。管道符“|”的作用就是從“|”左邊的命令接受輸出數據併發送給“|”右邊的命令作爲輸入數據。
如:ls -l /etc | more
管道符“|”的功能非常強大且很有用,利用它可以實現一些複雜的操作。在下一節關於信息查找命令部分,我們將會看到它的一些應用。
(五)其它特殊字符
美元符“$”是一個特殊操作符,當其置於變量名前面時,變量名會被變量值所代替。因此通常都是通過在變量名前加上“$”來引用該變量的值,“$”也常被稱爲變量取值符。
Unix中可以使用三種引號符:
(1)單引號(’ ’):功能是讓系統原樣輸出單引號中所含的內容。
(2)雙引號(“ ”):雙引號中的字符串若含有通配符,則系統會先進行通配後再輸出;若含有變量取值符“$”,則系統會先進行變量取值後再輸出。
(3)反引號(` `):反引號中所含的內容必須是一個命令,這樣它會先執行此命令,然後把命令執行的結果返回輸出。
對於上述幾個特殊字符,在下文關於Shell腳本編程部分大家會看到具體的應用例子。此外,常見的特殊字符還有“.”代表用戶所在的當前目錄,“..”代表用戶所在的當前目錄的父目錄,“~”代表用戶登陸系統的主目錄。