Ubuntu的圖形界面使用起來非常方便,但是要想對Linux熟練掌握,就必須學會它的操作命令。雖然可能會花費一些時間,不過從長遠的角度來說,這的確是一件事半功倍的事情,它會讓我們更瞭解Linux,更靈活地去使用Linux。Ubuntu提供了很多命令,不過在本章中不做全部介紹,只是先介紹一些常用命令, ...
Ubuntu的圖形界面使用起來非常方便,但是要想對Linux熟練掌握,就必須學會它的操作命令。雖然可能會花費一些時間,不過從長遠的角度來說,這的確是一件事半功倍的事情,它會讓我們更瞭解Linux,更靈活地去使用Linux。
Ubuntu提供了很多命令,不過在本章中不做全部介紹,只是先介紹一些常用命令,其他則分散到各個章節中。初學Linux一定要特別註意,學習命令並不意味著要掌握全部命令和每個命令的全部選項,這並不是必要的。先掌握最常用命令的最常用選項就好,下麵就讓我們來體會一下Ubuntu命令的強大功能。
7.1 基本命令
Ubuntu的命令較多,但是對於一些常用的系統操作,無非就是一些創建、查看、移動、複製等,本小節先熟悉一下這些基本命令。在學習這些基本命令之前,應該先瞭解一下Linux的一些特性和在Linux中命令的執行方式。
在Linux中,所有設備都是用文件名來表示的,就像我們在分區時所瞭解的那樣,這與我們所熟悉的Windows系統有很大不同,Linux中並沒有所謂C盤、D盤之類的說法,並且在Linux中只有文件和目錄(相當於Windows中的文件夾),所有文件和目錄都以倒樹狀結構掛載在“/”(讀做根目錄)目錄下,也正是因此Linux系統的管理員稱為root(樹根),如圖7-1所示。這稍後在第12章“文件系統管理”一章還會詳細介紹,現在大家只是有個概念即可。
圖7-1 Linux文件系統結構 |
[root@localhost: /etc # |
# 命令名 [-選項] 參數 |
需要註意的是,命令名、選項或者參數之間都是至少要有一個空格,多個空格沒有關係,選項不是必需的。當有多個選項時,可以寫在一起。因為Linux基本是由C語言編寫的,所以無論命令名或選項,Linux都是嚴格區分大小寫的。
在瞭解了以上基本的內容後,下麵就來詳細地介紹Linux的基本命令
7.1.1 列出文件清單命令:ls
ls命令能夠列出當前目錄下的所有內容。ls 命令的執行方式為:
# ls [-選項] [文件名或者目錄名] |
進入到Linux命令行中後,我們至少要知道當前所處的位置有哪些內容,這些信息就可以使用ls命令來獲得。它有很多的命令選項,並且選項之間可以互相組合使用,我們只列出其中常見的一些,見表7-1。
表7-1 ls命令的選項說明
在Linux中,ls命令是最常使用的命令之一,因為在命令行下要隨時查看目錄內容。如果不加任何選項的話,ls命令僅列出當前目錄下的文件和目錄名,例如,想要查看/etc目錄下的內容,可以使用下列命令:
# ls /etc |
如果想要列出當前目錄下所有文件,則可以使用下列命令:
# ls -a |
圖7-2 ls -a命令執行結果 |
讀者可能會發現裡面有很多以“.”為開頭的文件或者目錄,在Linux中,如果一個文件名(目錄名)以“.”開頭則表示它是隱藏文件(目錄)。並且在預設情況下,藍色代表一個目錄,白色代表一個普通文件。
提示:
在Ubuntu中,在預設情況下藍色代表目錄,白色代表普通文件,紅色代表壓縮文件或者軟體包,綠色代表可執行文件,淺藍色代錶鏈接文件,黃色代表設備文件等。但是這並不是在所有情況下都是有效的,之所以能以顏色區分,是因為在執行命令“ls -l”時,實際上是執行了“ls --color=auto”命令,可以使用alias命令進行查看,這種設置命令別名的方式在第9章會詳細介紹。如果要想確切地知道到底是文件還是目錄,可以通過ls –l命令,首行字母為“d”則為目錄,首行字母為“-”的即為文件,首行字母為“l”的為軟鏈接文件
7.1.2 改變當前路徑命令:cd
cd命令能夠改變當前用戶所處的位置。cd命令比較簡單,其命令執行的方式為:
# cd 路徑 |
使用cd命令之前,先來瞭解一下絕對路徑和相對路徑的概念。
我們知道,Ubuntu中所有文件或者目錄都掛載在“/”目錄下,所以如果一個文件或者目錄的詳細位置是從“/”開始的話,這樣的路徑稱為絕對路徑,如/etc/init.d/lvm。如果路徑不是從根寫起,則稱之為相對路徑,例如,現在所處的位置為/etc目錄中,如果現在要進入init.d目錄中,則可以執行如下命令:
# cd init.d |
這種不是從根目錄寫起的路徑稱為相對路徑。
其實這兩種路徑的寫法都能達到同樣的效果,相對路徑的寫法有時候更加快速、方便一些,例如,進入很深的一個目錄結構中時,而絕對路徑能夠確保路徑一定正確。
例如,現在想從/root目錄中進入到/etc目錄中,可以下達命令:
# cd /etc |
使用cd命令時,有幾個特殊格式的目錄表示方式需要我們瞭解一下,參見表7-2。
表7-2 特殊目錄的表示方法及含義
特殊目錄的表示方法 |
含 義 |
. |
代表當前目錄 |
.. |
代表上層目錄 |
~ |
代表當然登錄用戶的宿主目錄 |
~用戶名 |
代表進入~後用戶的宿主目錄 |
- |
代表前一目錄,即進入當前目錄之前操作的目錄 |
上述目錄操作方式如圖7-3所示。
(點擊查看大圖)圖7-3 特殊目錄的使用方法 |
提示:
直接在命令行中輸入cd命令而不加任何參數,可以馬上回到用戶的主目錄(home),這一點與DOS中cd命令顯示當前路徑不同,請一定註意。在Linux中,很多與用戶自身相關的配置文件、屬於自己的文檔、程式、腳本和安裝包等都存放在用戶自己的home目錄中,這個目錄就相當於Microsoft Windows中的“我的文檔”。所以能用cd命令直接“回家”,真的很方便
7.1.3 查看當前路徑命令:pwd
pwd命令能夠顯示當前所處的路徑。
這個命令比較簡單,如果有時在操作過程中忘記了當前的路徑,則可以通過此命令來查看路徑,其執行方式為:
# pwd |
第一行為運行的命令,第二行的內容為運行pwd命令後顯示的信息,即顯示用戶當前所在的工作目錄的路徑為/home/samlee。
提示:
應該經常使用pwd命令。Linux的目錄結構非常複雜,一個小小的分支就可能會有十幾層目錄,就好像是個森林,所以Linux不會像Windows那樣把全路徑寫在提示符里,那樣太長了。
在目錄用cd鑽來鑽去,很容易記不清自己到底身在何處,這時候執行命令可是有點危險的,例如,想刪除一個文件,不搞清楚當前目錄,可能會誤刪除同名的有用文件,而且沒那麼容易恢復。還有很多其他的情況需要使用pwd,尤其是在執行“rm –rf”這種對目錄直接刪除的操作時,更需要用pwd確定一下,可能每執行十幾個命令就會輸入一回。我們應該感謝Jim Meyering先生,他是pwd的創作者。
7.1.4 改變文件創建時間及創建空文件命令:touch
touch命令能夠創建一個空白文件,或者改變文件的創建時間。
touch命令的執行方式為:
# touch 文件名 |
一般來說,建立一個文件都會使用一個文本編輯器(如第8章要介紹的vi編輯器),但是也可以使用touch命令來創建一個空白的文件。
例如,現在要在/home目錄下創建一個名為test的空白文件,可以執行命令:
# touch /home/test |
實際上,對於touch命令來說,其最主要的功能是改變文件的時間,那麼一個文件擁有哪些時間屬性呢?對於一個文件來說,主要有三種時間屬性,分別為:
(1)mtime:這個時間記錄的是文件內容被修改的時間。
(2)ctime:這個時間記錄的是文件的屬性(所有者、所屬組、文件名)或者許可權被修改的時間。
(3)atime:這個時間記錄的是文件的內容被讀取的時間。
下麵我們舉個例子來說明,現在我們在/home目錄下創建了一個文件file,然後分別查看其三個時間,命令操作如圖7-4所示。
(點擊查看大圖)圖7-4 顯示文件的三種時間狀態 |
(點擊查看大圖)圖7-5 文件的三種時間狀態發生變化後效果 |
(點擊查看大圖)圖7-6 使用touch命令改變時間狀態 |
這樣就將file文件的時間變成了當前的時間。
touch 命令的參數不多,常見的有以下幾個,見表7-3。
表7-3 touch命令選項
7.1.5 創建目錄命令:mkdir
mkdir 命令能夠創建一個目錄。mkdir 命令的執行方式為:
# mkdir 目錄名 |
其實一個目錄就是一個特殊類型的文件,就如同Windows中的文件夾一樣,目錄裡面既可以有文件,也可以有子目錄,就是因為有目錄的存在,Linux才能夠以一種目錄樹的結構對文件系統進行管理。
例如現在要建立一個directory目錄,則可以執行命令:
# mkdir directory |
創建完目錄後可以使用ls –l命令去查看目錄是否建立成功。如果directory所在行的第一個字母為d,則說明建立成功。
有時候我們需要一次性地建立多級目錄,則可以使用-p參數:
# mkdir -p /home/dir1/dir2/dir3 |
7.1.6 刪除空目錄命令:rmdir
rmdir命令能夠刪除一個空目錄。rmdir命令的執行方式為:
# rmdir 目錄名 |
對於目錄來說,如果裡面為空的時候可以使用rmdir命令來刪除,並且此命令只能用來刪除空目錄,如果是非空目錄,則需要使用下麵要介紹的rm 命令。
例如我們要刪除/home/directory這個空目錄,則可以執行命令:
# rmdir /home/directory |
提示:
rmdir可以刪除的是非空目錄,被刪的目錄下不能有文件或子目錄。如果只是有子目錄存在,還可以用-p來刪除;如果含有文件,那麼-p選項也無能為力了。只有使用“rm –rf”大法,才能“連根拔起”。
7.1.7 除文件(目錄)命令:rm
rm命令能夠刪除一個文件或者目錄。rm命令的執行方式為:
# rm [-選項] 文件名或者目錄名 |
對於Ubuntu來說,這個命令是比較危險的一個命令,因為一旦使用了這個命令刪除的文件如果再進行了磁碟寫操作後將無法再恢復。在其他版本的一些Linux中,預設情況下給rm命令加上了一個i選項,可以在刪除前對操作進行確認,建議當學習完Shell一節後也利用命令別名使其擁有這一特性。
剛纔介紹的rmdir命令只能刪除一個空目錄,而rm命令不但能刪除任何目錄,而且可以刪除文件。
例如,現在在/home目錄下分別建立一個文件file和一個目錄directory,並且在目錄directory下建立file1文件,操作如下:
# touch /home/file |
現在分別將file文件和directory目錄刪除,操作如下:
# rm /home/file |
現在就可以將file文件和directory目錄刪除了,註意,當使用rm命令刪除目錄時,應該加上-r選項,否則系統會顯示不能刪除目錄的信息。rm命令選項如表7-4所示。
如果我們要在每一次執行此命令前都要進行確認操作是否進行,則可以加上-i 選項:
# rm -i /home/file |
表7-4 rm命令選項
7.1.8 複製命令:cp
cp命令能夠複製一個文件或者生成一個不同名但是內容相同的文件。
cp命令的執行方式:
如果是複製文件,則執行方式為:
# cp源文件名 目標路徑 |
# cp源文件名 目標文件名 |
# cp /etc/passwd /home |
# cp passwd passwd_new |
這樣就生成了一個passwd_new文件,其內容與passwd文件內容相同。以後當配置DNS伺服器的時候,就可以採用同樣的方法生成不同的區域數據文件,然後只需要對每個文件裡面的不同部分進行修改就可以了,避免了每生成一個文件都要重新寫一遍的麻煩。
cp命令的選項非常多,表7-5將其常用的一些列出。
表7-5 cp命令選項
7.1.9 移動文件(目錄)命令:mv
mv命令用來移動一個文件(目錄)或者是給文件(目錄)改名。
mv命令的執行方式為:
如果是移動文件,則執行方式為:
# mv要移動的文件 目標路徑 |
# mv原文件名 新文件名 |
# mv /test /home |
# mv /home/test /home/test_new |
這樣就將test文件成功改名為test_new。
7.1.10 顯示文件內容命令:cat
cat命令能夠顯示一個文件的內容。
cat命令的執行方式為:
# cat 文件名 |
# cat /etc/passwd |
# cat /etc/passwd | more |
# cat /etc/passwd >> /home/passwd_bak |
這樣passwd文件的內容就會追加到passwd_bak文件中,從而達到兩個文件合併的目的。
7.1.11 從頭開始查看文件內容命令:head
head命令能夠從頭開始顯示文件內容,並且能夠設定查看的行數。
head命令的執行方式為:
# head [-n] 文件名 |
n為數字,即設定的行數。
head命令能夠從文件開始處查看一個文件的指定的行數,如想要查看/etc/passwd文件的前五行,可以執行命令:
# head -5 /etc/passwd |
如果沒有指定行數的話,預設是顯示前十行。
7.1.12 tail命令
tail命令能夠從文件結尾開始顯示文件內容,並且指定查看的行數。
tail命令的執行方式:
# tail [-n] 文件名 |
# tail -5 /etc/passwd |
與head命令一樣,如果沒有指定行數的,預設是顯示後面十行。
7.1.13 分屏顯示文件命令:more(less)
more命令能夠對文件內容或者查詢結果進行分屏顯示。more命令的執行方式為:
# more 文件名 |
# more /etc/passwd |
# cat /etc/passwd | more |
這時就可以分屏來查看文件內容了,可以通過回車鍵向下一行行滾動,但是它的缺點是不能夠進行向上滾動,如果想向上翻屏,需要使用less命令,less命令的用法與more命令完全相同,唯一不同點是less命令能夠向上翻屏。可以通過上下箭頭進行上下一行行滾動,也可以通過page up/page down命令向上/向下進行一屏一屏滾動。
7.2 文件處理命令
Linux提供了一些用於處理文件的命令,使用它們,能夠完成很多只有高級文本編輯器才能完成的功能,本節對其常用的一些進行介紹。
7.2.1 文件比較命令:diff
diff命令能夠比較兩個文件的差異,diff命令的執行方式為:
# diff [-選項] 文件一 文件二 |
# cp /etc/passwd |
這樣就很容易看到兩個文件的不同了。
diff命令後還可以加一個目錄名和文件名或者兩個都是文件名,換句話說,如果上述命令執行方式處的文件一(或者是文件二)是目錄,文件二(或者是文件一)不是目錄,這樣diff就會在目錄中找到與文件名相匹配的文件進行比較,例如:
# diff /home file |
這樣diff會在/home目錄中找到是否有file文件,然後與後面的file文件進行內容比較。
7.2.2 排序命令:sort
sort命令能夠對文件內容或者查詢結果進行排序。
sort命令的執行方式為:
# sort [-選項] 文件名 |
sort命令可以對指定文件中的所有行進行排序,它的排序是根據從指定的行抽取的一個或者多個關鍵字來進行排序的。
例如,現在想根據/etc/passwd文件中的第三列來將passwd文件進行排序後輸出,應該下達如下命令:
# sort -t “:” -k 3 /etc/passwd |
其中-t選項指定了每列的分割符,-k選項指定了以第幾列進行排序。
sort命令選項很多,表7-6列出了其常用選項:
表7-6 sort命令選項
7.2.3 統計命令: wc
wc命令可以對文件的行數、單詞數和字元數進行統計。
wc命令執行方式為:
# wc [-選項] 文件名 |
# wc -l /etc/passwd |
這樣就能夠得到當前Ubuntu系統中的用戶數,wc命令還經常和管道符進行聯合使用,對前一個命令的查詢結果進行統計。
sort命令的常用選項如表7-7所示。
表7-7 wc命令選項
7.3 設置許可權命令
在Linux中,一個用戶對一個文件(目錄)是否有權利去使用,是根據此文件(目錄)設置的許可權所決定的。Ubuntu中的每個用戶都至少屬於一個組。
現以一個班級為例說明用戶與組的關係。我們可以把班級里的每個學生看成是Ubuntu里的一個用戶,現班級規定,每個人必須參加一個興趣小組,甲同學參加了科技小組,那麼他就是科技小組這個“組”里的成員,乙同學參加了書法小組,那麼他就是書法小組這個“組”里成員,對於科技小組來說,組裡的自己的私有物品也只有自己能夠使用,如果書法小組的人想使用科技小組裡成員的物品的話,需要科技小組的成員的物品所有者同意才可,但是由於科技小組裡的成員都是一個小組,所以可能他們互相之間的使用物品的許可權要比外組的成員要大一些。可以用圖7-7表示。
圖7-7 用戶與組的關係 |
可以看到,一個用戶既可以屬於一個組,也可以屬於多個組,而每個組裡成員的各自物品都可以根據自己的規定來讓同組的成員和不在此組裡的成員使用,實際上,這就是Linux最基本的許可權模型。
Linux中的一個文件在正常情況下是屬於一個用戶所有,將此用戶稱為文件的所有者(也可以稱為屬主),而將一些用戶統一分在一個組裡,設定此組對文件操作的許可權,這個組為文件的所屬組,既不是文件的所有者,也不是文件的所屬組裡的用戶我們統一稱為其他人。
瞭解了這些基本概念後,我們就來學習一下設定許可權的相關命令。需要說明的是,對於超級用戶(UID為0)來說,它擁有所有許可權
7.3.1 設定許可權命令 chmod(1)
chmod命令能夠對文件設定許可權。
在Linux中,文件(目錄)的許可權分為可讀、可寫、可執行三類許可權,其中可讀用字母r表示,可寫用字母w表示,可執行用字母x表示。
1.對於文件來說
可讀是指可以查看文件內容,例如,使用vi或者cat命令能夠查看文件內容。
可寫是指可以修改文件內容並且保存修改後的結果,如使用vi命令能夠修改文件內容後保存。
可執行指的是能夠運行此文件,在Linux中,一個是否能夠執行不決定於其擴展名,而是看其是否被設定了可執行許可權,當然前提是本身一定是個二進位文件或者腳本文件。例如普通文本文件即使設定了可執行許可權後也無法執行。
2.對於目錄來說
可讀是指能使用ls命令顯示目錄下的內容。
可寫指的是能夠在此目錄下建立和刪除文件。在Linux中,一個文件是否能夠被刪除,是決定於其所在目錄是否對命令執行者設定可寫許可權,而與文件本身許可權無關,文件本身許可權只是對文件本身內容或者是否能執行進行限制。
可執行指的是能夠在目錄下運行命令,所以如果想讓一個用戶能夠進入此目錄,必須對此目錄在相應的許可權位上設定可執行許可權。
在對文件和目錄設定之前,來看一下如何查看文件的許可權。
在Linux中,使用ls -l命令查看許可權屬性。對於/etc/passwd文件,使用ls -l命令後結果如圖7-8所示。
(點擊查看大圖)圖7-8 /etc/passwd文件許可權 |
下麵介紹每列含義:
(1)第一列:文件類型和許可權,這部分稍後重點介紹。
(2)第二列:i節點,即硬鏈接數,在文件系統部分還會介紹。
(3)第三列:文件的屬主,即文件的所有者,有時候我們將一個文件複製給另一用戶,要記得將文件的屬主也要改變,否則可能會發生文件許可權不對的錯誤。
(4)第四列:文件的屬組,即文件的所屬組,即在此組裡的用戶對文件有擁有不同的許可權。
(5)第五列:文件的大小,大小以位元組顯示。
(6)第六列:最近一次文件內容的修改時間,即mtime。
(7)第七列:文件或者目錄名。
現在重點來解釋第一列,/etc/passwd文件使用ls -l命令後,查詢結果的第一列如下:
-rw-r--r-- |
可以看到,這部分還可以細分為十列,實際上可以將這十列分為兩部分,第一列為第一部分,代表了文件的類型,文件的類型主要有以下幾種:
(1)-表示是普通文件
(2)d表示是目錄
(3)l表示是鏈接文件
(4)b表示是塊設備文件,例如硬碟的存儲設備等
(5)c表示是字元設備文件,如鍵盤等
(6)s表示是套接字文件,此主要跟網路程式有關
(7)p表示是管道文件
這樣根據文件類型就可以判斷一個文件到底是文件還是目錄,或者是哪種類型的文件,即使文件不以顏色顯示也沒有關係了。
第二列至第十列為第二部分,這部分一共9列,每三列為一組,共分為三組,由左至右分別代表了屬主的許可權,屬組的許可權,其他人的許可權。如對於剛纔我們查詢的結果來說,/etc/passwd文件屬主為root,屬於root組,各部分許可權分別為:
屬主的許可權為:rw-
屬組的許可權為:r--
其他人的許可權為:r--
我們發現,每組正好由三列組成,依次代表了可讀許可權、可寫許可權、可執行許可權。也就是說,如果屬主對文件擁有可讀許可權,則在屬主許可權位上的第一列就用r表示,而“-”代表沒有相關的許可權。由此我們可以得到/etc/passwd文件的許可權:
root(屬主)用戶對passwd文件擁有可讀(r)可寫(w)許可權。
root(屬組)組裡的用戶對passwd文件擁有可讀許可權。
既不是root用戶也不屬於root組的用戶對文件擁有可讀許可權。
下麵我們使用chmod命令來設定文件的許可權。
chmod 命令的格式為:
chmod [選項] 許可權 文件名(目錄名) |
使用chmod命令設定許可權的方法有兩種:數字和字元。
1.數字方式設定許可權
文件的許可權共有三種:可讀(r)、可寫(w)、可執行(x),使用數字4代表讀許可權;2代表寫許可權;1代表可執行許可權;0表示沒有相應的許可權,所以,如果用戶擁有哪個許可權,就將其代表的數字相加,最後相加的和即為用戶的許可權。比如說,還是以passwd文件為例,我們知道root(屬主)用戶對文件擁有的許可權為rw-,所以使用數字來代表即為:
4(r) + 2(w) + 0(-)= 6 |
屬組的許可權:4(r) + 0(-) + 0(-) = 4 |
ubuntu(屬主)用戶可讀可寫 |
屬主:4(讀) + 2 (寫) + 0(執行) = 6 |
(點擊查看大圖)圖7-9 使用chmod設定許可權 |
7.3.1 設定許可權命令 chmod(2)
2.字元方式設定許可權
還可以使用字元方式設定許可權,使用字元方式能夠很方便地對文件的許可權進行修改和設定。字元方式各符見表7-8。
表7-8 字元方式設定許可權
使用字元方式設定許可權,有時可以在原來的許可權基礎上進行修改,現在舉例說明:使用Ubuntu用戶創建文件file,然後執行以下操作:
(1)將其許可權設定為所有人都只讀
(2)將文件屬主增加可寫許可權
(3)將其他人的可讀許可權去除
執行結果如圖7-10所示。
(點擊查看大圖)圖7-10 使用字元方式設定許可權 |
# chmod u+w,o-r file |
# chmod -R 755 /home |
這樣就可以將/home目錄以及其目錄下的所有文件和目錄許可權都設定為755。
7.3.2 更改屬主(屬組)命令:chown
chown命令可以更改一個文件(目錄)的屬主或者屬組。
chown命令的執行方式為:
# chown [選項] 屬主[.屬組] 文件名 |
使用chown命令,能夠將一個文件的屬主或者屬組進行或者同時進行改變。同時改變時,屬主和屬組之間使用“.”隔開,還可以使用-R選項同時將目錄下的所有文件和目錄的屬主和屬組進行修改。
例如,現在使用root用戶創建一個文件,然後執行下列操作:
(1)將其文件屬主改為ubuntu用戶
(2)將其屬組改為users組
(3)將屬主和屬組同時改為root
執行命令結果見圖7-11。
(點擊查看大圖)圖7-11 使用chown命令 |
在本例中使用root賬號進行操作,防止來回在不一樣的用戶間進行切換,由上面的命令可知,單獨改變文件的屬組時,需要在屬組組名前面加上“.”。對於root用戶來說,一般情況下,文件的許可權對其不起作用,特殊情況會在高級許可權設定時講解。
7.3.3 更改文件屬組命令:chgrp
chgrp命令能夠改變文件(目錄)的屬組。
chgrp命令的執行方式為:
# chgrp [選項] 屬組 文件名 |
chgrp命令只是單純的修改文件的屬組,例如:
# chgrp users file |
此命令的執行結果是將file文件的屬組改為了users。
提示:
chgrp與chown命令的用法基本是一致的,用法也比較簡單。可以用-R參數把一個目錄下的所有內容都改變用戶和組。
7.4 文件查找命令
相信每個人都有過在電腦查找一些文件的經歷,對於記憶力不是很好的筆者更是經常如此,相信大家對Windows的搜索功能還是記憶猶新,其實Ubuntu也提供了功能非常強大的查找命令,下麵我們就來體會一下。
7.4.1 按路徑進行查找的命令:which
which命令能夠按PATH變數所規定的路徑進行查找。
which命令的執行方式為:
# which 命令名 |
系統預設是有很多系統變數存在的,其中有一個變數PATH,它定義了執行命令時命令所要查找的路徑,例如,執行passwd命令給用戶改密碼時,系統會自動去PATH變數所規定的路徑下去搜尋是否有此命令,如果有,則執行,否則將提示命令不存在,這也是為什麼有些Linux初學者明明在當前目錄下執行此目錄里的命令而出現系統提示命令不存在(此時若要執行可以下達命令./命令名)。
這點與Windows有很大不同,其實Windows也是有PATH變數存在的,當初筆者曾經在工作的時候安裝UG軟體,結果安裝完成後總是無法運行UG程式,最後將UG程式的路徑給放到PATH變數里才正常運行。
由上可以看出,PATH變數是存放命令的,而which是按PATH變數規定的路徑來找,所以which主要是用來查找命令的,並且查找到後將命令的絕對路徑給顯示出來。
例如,現在想知道which命令本身的絕對路徑,可以下達命令:
# which which |
/usr/bin/which |
Which命令一般只查詢到第一個匹配的結果,如果想將所有匹配的結果全部顯示出來可以加上-a參數。
7.4.2 按資料庫查找的命令:whereis
whereis命令能夠將不但能查詢出命令,還能查詢出Ubuntu資料庫里記載的文件。
whereis命令的下達方式為:
#whereis [選項]文件名 |
與which不同的是,whereis不但能夠找到可執行的命令,而且將所有包含文件名字元串的文件全部查找出來,而且速度非常快,遠遠快於我們將要介紹的雖然強大但速度卻有些慢的find命令。這是因為Ubuntu會將它裡面所有的資料都記錄在一個資料庫里,而whereis命令查找時並不會在整個磁碟上進行查找,而只在此資料庫里進行查找。
例如使用whereis命令來執行搜尋passwd,得到的結果如圖7-12所示。
(點擊查看大圖)圖7-12 使用whereis命令 |
可以看到,不但找到了passwd命令,連passwd文件等也找到了。
whereis命令常見選項如表7-9所列。
表7-9 whereis命令選項
7.4.3 查找所有匹配的文件的命令:locate
locate命令能夠將所有與被查詢的文件名相同的文件查詢出來。
locate命令的執行方式為:
# locate 文件名 |
locate命令的下達方式比較簡單,直接加上要查詢的文件名即可,因為它也是從資料庫進行查詢,所以速度也比較快,但是因為資料庫的信息由crond進程式控制制更新,所以有時會發生剛安裝完的軟體查詢不到的現象。
7.4.4 功能強大的查找命令:find
find命令能夠按多種方式指定查詢條件,然後進行查詢出指定的文件。
說明:因為find命令功能強大,而且能夠設定查詢條件,裡面涉及的許可權和文件類型的相關知識,所以大家可以在學完相應的章節後再來學習find命令。
find命令的執行方式:
# find 查找的路徑 [選項] [對查詢到結果執行的命令] |
find命令能夠按照用戶給定的條件進行查找,並且可以指定查找的路徑,它甚至可以在整個文件系統內或者在具有網路文件系統(NFS)的情況下進行查找。
為了方便起見,我們將根據find 命令的選項進行分類說明。
1.根據文件時間狀態進行查找
大家還記得介紹touch命令時提到的與文件有關的三個時間吧,所以根據文件時間狀態進行查找主要有以下幾項:
-atime(+ | -)n:此選項代表查找出n天以前被讀取過的文件。 |
說明:
n為數字,如果前面沒有+或者-號,代表的是查找出n天以前的,但是只是一天之內的範圍內發生變化的文件。
如果n前面有+號,則代表查找距離n天之前的發生變化的文件。如果是減號,則代表查找距離n天之內的所有發生變化的文件。
-newer file1 ! –newer file2中的!是邏輯非運算符。
下麵舉例說明,現在想查詢一下所有在最近三天之內內容發生變化的文件,可以執行:
# find / -mtime -3 |
#find /home -newer file1 ! –newer file2 |
2.根據用戶或者組進行查找
系統記錄一個用戶實際上記錄的是它的UID號,而記錄組則是記錄的GID號,所以根據用戶或者組進行查找的選項為:
-user 用戶名:根據文件的屬主名查找文件。 |
說明:
關於用戶的UID和GID的說明請查閱用戶管理一章。
有時我們可能使用一個用戶建立了一些文件,當此用戶被刪除後,他所建立的文件就成了無屬主的文件了,所以我們應該用-nouser來查詢,-nogroup與之相同。
下麵舉例說明,現在想查找所有在/home目錄中屬主是Ubuntu用戶的文件,應執行命令:
# find /home -user ubuntu |
# find /etc -nouser |
3.根據文件的許可權或者大小名字類型進行查找
Linux里的文件是否能夠執行與它的擴展名無關,主要是看它是否設置了可執行許可權。所以根據文件許可權我們也可以設定查找條件:
-name文件名:按找文件名進行查找。 |
說明:
文件類型可以通過ls -l命令進行查詢,“-”代表普通文件,“d”代表目錄。“b”代表設備文件,“c”代表字元設備文件,具體每部分的含義詳見文件系統一章。
按文件大小進行查詢時,預設的單位是塊,因為絕大多數人習慣使用位元組或者K等單位,所以我們用“c”表示位元組,用“k”表示1024位元組。前面如果有“+”號代表大於n所指定的大小,“-”代表小於n所指定的大小,沒有的話表示正好等於n所指定的大小。
關於文件的許可權設定請參照文件系統章節中許可權設定部分,在此不再詳述。但需要註意的是此許可權應該是4位,即加上了特殊許可權位的部分。如果文件許可權前面有“+”號,則表示所查找的文件的許可權中有前面許可權條件的任意一個即可,如果是“-”號,則表示所查找的文件的許可權中至少要包含前面許可權的所有,比許可權條件多沒有關係,但一定不能少於許可權條件。
下麵舉例說明,現在想找出/etc目錄內所有的文件大小超過1MB的文件,則執行命令:
# find /etc -size +1000000c |
在此處1000000c也可以用1000K來表示。
如果想要找出系統內所有具有SUID位的文件,則執行命令:
# find / -perm -4000 |
因為找到的文件必須要具有SUID位,所以要用”-4000”,如果是用“+4000”的話,意思是一個文件只要擁有上述任意一個條件就會被顯示出來。
如果想查系統內所有具有SUID,SGID或者黏滯位的文件找出來,可以執行命令:
# find / -perm +7000 |
這條命令將會把系統內的任意一個只要具有SUID或者SGID或黏滯位的文件都列出來。
4.多個查找選項的應用
有時候需要查找同時符合兩個條件,這時需要-a或者-o選項:
-o:邏輯或,兩個條件只要滿足一個即可。 |
# find /etc -name inittab -o -name grub.conf |
查找/etc目錄下文件名為inittab或文件名為grub.conf的文件。
5.對查找到結果的處理
有時候我們對於查找到的結果需要對其進行進一步的操作,這就需要使用-exec或者-ok選項,或者使用-print選項。其使用的格式為:
# find 查找的路徑 [選項] [對結果處理的命令] |
-exec shell命令 {} \; |
其中-exec就是代表要執行shell命令,後面加的是shell指令,再後面的“{}”表示的是要對前面查詢到的結果進行查詢,最後的“\;”表示命令結束。需要註意的是“{}”和“\”之間是要有空格的。而-ok選項與-exec的唯一區別就是它在執行shell命令的時候會事先進行詢問,-print選項是將結果顯示在標準輸入上。
例如現在我們想查找系統內所有具有SUID位的文件,並且將結果保存在/root/SUID_file中,則執行命令: