Mongoose House

          Technical Edition

          統計

          留言簿(4)

          積分與排名

          閱讀排行榜

          Linux 文件命令精通指南

          作者:Sheryl Calish

          為剛接觸 Linux 文件命令的初學者提供的速成教程

          雖然 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 中將匹配一個或更多的字符,但在正則表達式中,它匹配上述字符的零個或更多的實例。一些命令(如 egrepawk)使用了一組更廣泛的特殊字符來進行模式匹配。

          文件處理命令

          剖析一個文件列表

          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:foo@yahoo.com' {} \;
          

          這里,我們讓 find 命令在當前目錄中開始執行, . ,查找一個 html 文件, *.html ,并在當前文件上執行 ( -exec ) grep 命令, {} 。當使用 -exec 操作時,需要一個分號 ; ,這是用來在使用 find 命令時執行其它一些操作。需要反斜線 \ 和引號來確保這些項目通過 BASH,以使它們由命令而不是 shell 來進行解釋。

          轉載:http://www.oracle.com/technology/global/cn/pub/articles/calish_file_commands.html

          posted on 2006-09-04 16:44 Mongoose 閱讀(328) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 延庆县| 贵州省| 永州市| 内丘县| 五寨县| 儋州市| 平泉县| 苍山县| 南充市| 永仁县| 博湖县| 东乌珠穆沁旗| 盐津县| 镇雄县| 崇阳县| 当阳市| 德州市| 海宁市| 常熟市| 溧阳市| 温宿县| 常山县| 宣武区| 陇南市| 连云港市| 苏尼特右旗| 体育| 罗定市| 南城县| 陵水| 绥滨县| 靖西县| 石河子市| 侯马市| 临湘市| 涞源县| 建宁县| 沙洋县| 宜黄县| 金华市| 绍兴县|