Linux 檔案命令精通指南

來源:互聯網
上載者:User
作者: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 命令來查看當前所有的環境變數。

Regex和萬用字元

許多 Linux 命令使用萬用字元 * 和 ? 來匹配任意數量的字元或分別匹配任意的單個字元;正則模式比對運算式利用一個句點 (.) 來匹配除“分行符號”之外的任意單個字元。這兩種情況下都使用方括弧 ([ ]) 來匹配除“*”號之外的字元組。不過,* 號在各種情況下有類似但不同的意義:雖然它在 shell 中將匹配一個或更多的字元,但在Regex中,它匹配上述字元的零個或更多的執行個體。一些命令(如 egrep 和 awk)使用了一組更廣泛的特殊字元來進行模式比對。

檔案處理命令

剖析一個檔案清單

ls 命令用來查看使用者有執行許可權的任意目錄中的檔案清單,該命令有許多有趣的選項。例如:

$ ls -liah *22684 -rw-r--r--    1 bluher   users         952 Dec 28 18:43 .profile19942 -rw-r--r--    1 scalish  users          30 Jan  3 20:00 test2.out925 -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.outcp:overwrite `ls2.out'?

mv 命令允許使用 -b 選項,這將在移動檔案之前作一個備份拷貝。rm 和 cp 接受功能強大但卻危險的 -r 選項,它將在一個目錄和它的檔案上遞迴執行。

$ rm -ir Testrm: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 指示檔案類型。

查看和尋找檔案

檔案過濾器

用來讀取檔案內容和在檔案內容上執行操作的命令有時被稱為 ¹ý濾器。sed 和 awk 命令是兩個濾波器的例子,因為在以前的 OTN 文章中有它們詳細的討論,在這裡將略過。

諸如 cat、 more 和 less 之類的命令讓您能夠從命令列查看一個文字檔的內容,而無需調用編輯器。Cat 是 "concatenate" 的縮寫,它將預設地在標準輸出(顯示屏)上顯示檔案內容。和 cat 一起提供的最有趣的選項之一是 -n 選項,它用編號的輸出行來顯示檔案內容。

$ cat -n test.out1  This is a test.

因為 cat 一次性輸出檔案中的所有行,所以您可能更喜歡用 more 和 less,因為它們都一次輸出一屏的檔案內容。Less 是 more 的一個增強版本,它允許用來自 vi 文字編輯器的關鍵命令來增強檔案查看。例如,d 向前翻滾、b 向後翻滾 N 行(如果 N 是在 d 或 b 之前指定的)。為 N 輸入的值成為隨後的 d 命令的預設值。man 頁面工具 + 生產力使用 less 來顯示使用說明的內容。

重新導向和管道

重新導向允許將命令輸出重新導向到檔案中,而不是標準輸出,或者類似地,也可重新導向輸入。重新導向的標準符號 > 建立一個新的檔案。>> 符號將輸出添加到一個現有的檔案中:

$ more test2.outAnother test. $ cat test.out >> test2.out$ cat test2.outAnother 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 接收的Regex。而 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 來進行解釋。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.