Linux 檔案指令精通指南(初級)
釋出時間:2004.07.05 11:16 來源:Oracle 作者:Sheryl Calish
雖然 GUI 桌面(如 KDE 和 GNOME)能夠幫助使用者利用 Linux 特性,而無需關于指令行接口的功能知識,但還是經常會需要更多的功能和靈活性。而且,基本熟悉這些指令對于在 shell 腳本中正确地使某些功能自動化仍然是必需的。
這篇文章是關于 Linux 檔案指令的一個“速成教程”,它是為那些剛接觸這個作業系統或者隻是需要補充這方面知識的使用者提供的。它包含了對一些更有用的指令的一個簡明的概述以及關 于它們的最強大的應用的指導。下面包含的資訊 — 結合一些實驗 — 将使您能夠容易地掌握這些基本的指令。(注意:當涉及到一個與 Oracle 叢集檔案系統 (OCFS) 結合的核心時,這些指令中的某些指令的行為可能會稍微有所不同。在此情況下,Oracle 提供了一個 OCFS 工具集,該工具集可以為檔案指令應用提供一個更好的選擇。)
注意,這裡包含的所有示例都在 SUSE Linux 8.0 Professional 上進行了測試。雖然沒有理由相信它們在其它的系統上将不能工作,但如果出現問題,您應當檢視您的文檔,以了解可能的變化。
背景概念
在深入研究規範之前,讓我們回顧一些基礎知識。
檔案和指令
在 Linux/UNIX 作業系統中,所有事物都被當作檔案來處理:硬體裝置(包括鍵盤和終端)、目錄、指令本身,當然還有檔案。這個奇怪的慣例實際上是 Linux/UNIX 的能力和靈活性的基礎。
大多數(幾乎是全部)的指令形式如下:
command [option] [source file(s)] [target file]
擷取幫助
最有用的指令之一是那些提供幫助的指令(特别是對那些學習 Linux 的人而言)。Linux 中的兩個重要的資訊來源是聯機參考手冊,或 man 頁面和 whatis 工具。您可以用 whatis 指令來通路一個不熟悉的指令的 man 頁面。
$ whatis echo
要了解關于這個指令的更多資訊,可以使用:
$ man echo
如果您不知道某個特殊任務所需的指令,您可以用 man -k (也稱為 apropos)和一個主題來生成可能的指令。例如:
$ man -k files
一個很有用但常常被忽視的指令可以提供關于使用 man 本身的資訊:
$ man man
您可以用 SPACEBAR 來浏覽任意的 man 頁面;UP ARROW 将向上翻滾檔案。.要退出,則輸入 q,!,或 CTRL-Z。
使用者類别
記得那句名言“所有動物一例平等但有些動物比其他動物更加平等”嗎?在 Linux 世界中,根使用者掌管一切。
根使用者可以以另一個使用者名 su (源自 "superuser")登入。要執行諸如添加一個新使用者、列印機或檔案系統之類的任務,必須作為根使用者登入或者用 su 指令和根使用者密碼切換到超級使用者。系統檔案(包括控制初始化過程的系統檔案)歸根使用者所有。雖然可能允許普通使用者對它們進行讀操作,但出于系統安全性的原 因,編輯的權利将留給根使用者。
BASH shell
雖然提供了其它的 shell,但 BASH (Bourne Again Shell) 是 Linux 的預設 shell。它結合了與它同名的 Bourne shell 的特性和 Korn、C 和 TCSH shell 的特性。
BASH 内置的指令 history 預設記錄最後輸入的 500 條指令。可以通過在指令提示符下輸入 history 來檢視它們。要檢索某個特定的指令,可以在指令提示符下按 UP ARROW 或 DOWN ARROW,或在曆史清單中輸入它的編号,并在編号前面加上 "!",例如:
$ !49
您還可以通過一條指令在曆史清單中離位置最靠前的項目的距離來執行該指令:如果在曆史清單中有 53 個事件,$ !-3 将執行事件号 51。
像 UNIX/Linux 世界的其它 shell 一樣,BASH 使用了特殊的環境變量來友善系統管理。例如:
- HOME,使用者主目錄
- PATH,Linux 用來搜尋您輸入的指令的可執行鏡像的搜尋路徑
-
HISTSIZE,系統儲存的曆史事件的數量
除了這些保留的關鍵字之外,您還可以定義您自己的環境變量。例如,Oracle 使用 ORACLE_HOME (還有其它一些變量),要使 Oracle 安裝成功完成,必須在您的環境中設定這些變量。
可以在提示符下臨時設定變量:
$HISTSIZE=100
-
或者,在 /etc/profile (需要根使用者權限)中進行系統範圍的永久設定,或在 .profile 中進行局部永久設定。
可以通過 echo 指令,并用一個 $ 符号來通路一個環境變量的值,進而檢視該值。
$ echo $HOME
/home/bluher
可以用 env 指令來檢視目前所有的環境變量。
正規表達式和通配符
許多 Linux 指令使用通配符 * 和 ? 來比對任意數量的字元或分别比對任意的單個字元;正則模式比對表達式利用一個句點 (.) 來比對除“換行符”之外的任意單個字元。這兩種情況下都使用方括号 ([ ]) 來比對除“*”号之外的字元組。不過,* 号在各種情況下有類似但不同的意義:雖然它在 shell 中将比對一個或更多的字元,但在正規表達式中,它比對上述字元的零個或更多的執行個體。一些指令(如 egrep 和 awk)使用了一組更廣泛的特殊字元來進行模式比對。
檔案處理指令
剖析一個檔案清單
ls 指令用來檢視使用者有執行權限的任意目錄中的檔案清單,該指令有許多有趣的選項。例如:
$ ls -liah *
22684 -rw-r--r-- 1 bluher users 952 Dec 28 18:43 .profile
19942 -rw-r--r-- 1 scalish users 30 Jan 3 20:00 test2.out
925 -rwxr-xr-x 1 scalish users 378 Sep 2 2002 test.sh
上面的清單顯示 8 列:
- 第 1 列訓示檔案的 inode,因為我們使用了 -i 選項。剩下的列通過 -l 選項來進行正常顯示。
- 第 2 列顯示檔案類型和檔案通路權限。
- 第3 列顯示連結數,包括目錄。
- 第 4 和第 5 列顯示檔案的所有者群組所有者。這裡,所有者 "bluher" 屬于組 "users"。
- 第 6 列顯示檔案大小(機關為所顯示的機關,而不是預設的位元組數,因為我們使用了 -h 選項。
- 第 7 列顯示日期(它看起來像是三列),包括月、日和年,以及當天的時間。
-
第 8 列顯示檔案名。在選項清單中使用 -a 将使清單中包含隐藏檔案(如 .profile)的清單。
處理檔案
可以移動 (mv)、複制 (cp) 或删除 (rm) 檔案和目錄。明智地使用 -i 選項,以獲得确認通常是個不錯的主意。
$ cp -i ls.out ls2.out
cp:overwrite `ls2.out'?
mv 指令允許使用 -b 選項,這将在移動檔案之前作一個備份拷貝。rm 和 cp 接受功能強大但卻危險的 -r 選項,它将在一個目錄和它的檔案上遞歸執行。
$ rm -ir Test
rm:descend into directory `Test'? y
可以用 mkdir 來建立目錄,用 rmdir 來删除目錄。不過,因為不能用 rmdir 來删除包含檔案的目錄,是以使用 rm 加 -r 選項通常要更友善些。
出于安全的原因,所有的檔案都有所有權和保護。檔案通路權限(或檔案模式)包含之前提到的相同的 10 個字元:
- 第一個字元訓示檔案類型。最常見的是 - 代表檔案,d 代表目錄,而 l 代表連結。
-
接 下來的 9 個字元是三種使用者類别的通路權限:檔案所有者(字元 2-4),使用者組 (5-7) 和其它 (8-10),其中 r 表示讀權限,w 表示寫權限,x 訓示一個檔案上的執行權限。破折号 - 如果出現在這九個位置的任意一個,則訓示這個操作對該類别的使用者禁止。
可以使用 chmod 指令通過字元符号或二進制掩碼來設定通路權限。要使用二進制掩碼,必須将三個權限組的字元表示轉換成二進制格式,然後轉換成八進制格式:
使用者類别: 所有者 使用者組 其它
字元表示: rwx r-x r--
二進制表示: 111 101 100
八進制表示: 7 5 4
将寫權限賦予使用者組,您可以使用:
chmod g+w test.sh or chmod 774 test.sh
用 umask 指令,在 /etc/init.dev 檔案中進行系統範圍内的、或在 .profile 檔案中進行的本地的檔案權限預設設定。這個指令訓示用 777 減去這個數字來擷取預設的權限:
$ umask 022
這将為使用者建立的所有新檔案生成一個預設的檔案權限 755。
可以用 chown 來修改檔案的所有權:
$ chown bluher ls.out
這裡,bluher 是新的檔案所有者。類似地,組成員資格将按以下方式修改:
$ chgrp devgrp ls.out
這裡,devgrp 是新的使用者組。
ls 不提供哪些檔案是文本的,哪些檔案是二進制的的資訊。要了解這個資訊,您可以使用 file * 指令。
重命名檔案
賦予一個檔案多個名字的兩種流行的方法是利用連結和 alias 指令。Alias 可以用來為一個更長的指令重新起一個更友善的名字:
$ alias ll='ls -l'
$ ll
注意單引号的使用,這使得 BASH 将該項目傳遞給别名,而不是自己估計它。别名還可用作較長的路徑名的縮寫:
$ alias jdev9i=/jdev9i/jdev/bin/jdev
關于 alias 和它的反指令 unalias 的更多資訊,請檢視 BASH 的 man 頁面的 "SHELL BUILTIN COMMANDS" 子部分。在最後一個例子中,定義了一個環境變量來實作相同的結果。
$ export JDEV_HOME=/jdev9i/jdev/bin/jdev
$ echo $JDEV_HOME
/jdev9i/jdev/bin/jdev
$ $JDEV_HOME
連結允許幾個檔案名引用單個源檔案,格式如下:
ln [-s] fileyouwanttolinkto newname
單獨的 ln 指令建立到檔案的一個硬連結,而使用 -s 選項來建立一個符号連結。簡而言之,一個硬連結幾乎不能和原始的檔案區分開(除了這兩個檔案的 inode 将相同之外)。符号連結較容易區分,因為它們出現在一個長的檔案清單中,并用 -> 來訓示源檔案,l 訓示檔案類型。
檢視和查找檔案
檔案過濾器
用來讀取檔案内容和在檔案内容上執行操作的指令有時被稱為 1y濾器。sed 和 awk 指令是兩個濾波器的例子,因為在以前的 OTN 文章中有它們詳細的讨論,在這裡将略過。
諸如 cat、 more 和 less 之類的指令讓您能夠從指令行檢視一個文本檔案的内容,而無需調用編輯器。Cat 是 "concatenate" 的縮寫,它将預設地在标準輸出(顯示屏)上顯示檔案内容。和 cat 一起提供的最有趣的選項之一是 -n 選項,它用編号的輸出行來顯示檔案内容。
$ cat -n test.out
1 This is a test.
因為 cat 一次性輸出檔案中的所有行,是以您可能更喜歡用 more 和 less,因為它們都一次輸出一屏的檔案内容。Less 是 more 的一個增強的版本,它允許用來自 vi 文本編輯器的關鍵指令來增強檔案檢視。例如,d 向前翻滾、b 向後翻滾 N 行(如果 N 是在 d 或 b 之前指定的)。為 N 輸入的值成為随後的 d 指令的預設值。man 頁面實用工具使用 less 來顯示使用說明的内容。
重定向和管道
重定向允許将指令輸出重定向到檔案中,而不是标準輸出,或者類似地,也可重定向輸入。重定向的标準符号 > 建立一個新的檔案。>> 符号将輸出添加到一個現有的檔案中:
$ more test2.out
Another test.
$ cat test.out >> test2.out
$ cat test2.out
Another test.
This is a test.
到檔案的标準輸入可以用 < 符号來重定向:
$ cat < test2.out
錯誤消息用 2> 和 2>> 來重定向和添加,格式如下:
$ command 2> name_of_error_file
要避免無意地覆寫一個現有的檔案,使用 BASH 内置的指令集:
$ set -o noclobber
可以在指令和輸出檔案之間用 >! 符号來重載這個特性。要關閉這個特性,用 +o 代替 -o。
重定向在一個指令和檔案之間、或檔案和檔案之間工作。重定向語句的一項必須是一個檔案。
管道使用 |符号,并且在指令之間工作。例如,您可以用以下方式将一個指令的輸出直接發送到列印機上:
$ ls -l * | lpr
可以用以下方式快速地找到曆史清單中的一個指令:
$ history | grep cat
更多的濾波器
Grep、fgrep 和 egrep 都顯示比對一種模式的行。所有這三個指令都在檔案中搜尋指定的模式,如果您想不起來一個所需檔案的名稱,這将非常有用。基本格式是:
grep [options] PATTERN [FILE...]
$ grep -r 'Subject' nsmail
CTRL-Z 将終止上述或其它任何指令。
grep 的最有用的選項可能是 -s。如果您以除根使用者之外的任何身份搜尋系統檔案,那麼對于每一個您沒有通路權限的檔案,都将産生錯誤消息。這個指令禁止那些消息。
Fgrep(也以 grep -F 調用)隻查找固定的字元串,而不是 grep 接收的正規表達式。而 egrep 接收包含更大範圍的特殊字元(如 “|”,它訓示條件 OR 運算符)的模式。
$ egrep 'Subject|mailto' *
查找檔案
find 指令的 GNU 版本非常強大、靈活并且比 UNIX 系統上存在的經典版本更具包容性。它對于涉及到目錄結構的任務非常有用,包括在檔案上查找和執行指令。find 指令的基本格式是:
$ find startdirectory options matchcriteria [actionoptions]
如果您知道檔案的名稱、或者甚至名稱的一部分,但不知道它所處的目錄,您可以這麼做:
$ find .-name 'test*'
./test
./jdevhome/mywork/EmpWS/EmpBC4J/test
與經典的 UNIX 系統不同,在 Linux 中不需要在末尾添加 -print 操作,因為如果沒有指定其它的操作選項,就将假定執行這個操作。在目錄起始位置上的一個點 ( . ) 将使 find 在您的工作目錄中開始搜尋。兩個點, ..,在父目錄中開始搜尋。您可以在任意目錄下開始搜尋。
注意,您可以使用通配符作為搜尋準則的一部分(隻要用單引号将整個項目括起來)。
$ find .-name 'test*' -print
./test.out
./test2.out
顯示擁有 .out 擴充名的一系列檔案:
$ find /home -name '*.out'
不過記住,除非您是作為超級使用者運作這個指令,否則您将可能得到許多的 "Permission denied" 錯誤消息。
最強大的搜尋工具之一是和 grep 一起使用的 -exec 操作:
$ find .-name '*.html' -exec grep 'mailto:[email protected]' {} /;
這裡,我們讓 find 指令在目前目錄中開始執行,.,查找一個 html 檔案,*.html,并在目前檔案上執行 (-exec) grep 指令,{}。當使用 -exec 操作時,需要一個分号 ;,這是用來在使用 find 指令時執行其它一些操作。需要反斜線 / 和引号來確定這些項目通過 BASH,以使它們由指令而不是 shell 來進行解釋。
立即掌握 Linux 檔案指令
在 Linux 中提供了許多有用的指令和利用它們的強大的方法,在此無法一一說明。此外,完成許多任務通常都存在多種方法。
我們已經看到了一些最常用和最有啟發意義的 Linux 檔案指令。掌握這些基礎但卻關鍵的工具将使您的 Linux 學習走上快車道。利用您手頭上的 man 頁面,和試驗的積極性,您現在擁有了足夠的資訊來開始探索 Linux 檔案操作的力量。
在我的下一篇文章中,我将提供 Linux 系統指令的一個類似的說明。
作者簡介
Sheryl Calish [[email protected]] 是 Blue Heron Consulting 的一位專門研究 Linux 的 Oracle 開發人員。她還是 Central Florida Oracle Users Group 的基金主席和 IOUG Linux SIG 的銷售主席。