linux 查詢檔案

G8bao7發表於2015-09-06
轉載:  />

因為我們已經瀏覽了 Linux 系統,所以一件事已經變得非常清楚:一個典型的 Linux 系統包含很多檔案! 這就引發了一個問題,“我們怎樣查詢東西?”。雖然我們已經知道 Linux 檔案系統良好的組織結構,是源自 類 Unix 的作業系統代代傳承的習俗。但是僅檔案數量就會引起可怕的問題。在這一章中,我們將察看 兩個用來在系統中查詢檔案的工具。這些工具是:

  • locate – 透過名字來查詢檔案

  • find – 在目錄層次結構中搜尋檔案

我們也將看一個經常與檔案搜尋命令一起使用的命令,它用來處理搜尋到的檔案列表:

  • xargs – 從標準輸入生成和執行命令列

另外,我們將介紹兩個命令來協助我們探索:

  • touch – 更改檔案時間

  • stat – 顯示檔案或檔案系統狀態

locate - 查詢檔案的簡單方法

這個 locate 程式快速搜尋路徑名資料庫,並且輸出每個與給定字串相匹配的檔名。比如說, 例如,我們想要找到所有名字以“zip”開頭的程式。因為我們正在查詢程式,可以假定包含 匹配程式的目錄以”bin/”結尾。因此,我們試著以這種方式使用 locate 命令,來找到我們的檔案:

[me@linuxbox ~]$ locate bin/zip 

locate 命令將會搜尋它的路徑名資料庫,輸出任一個包含字串“bin/zip”的路徑名:

/usr/bin/zip
/usr/bin/zipcloak
/usr/bin/zipgrep
/usr/bin/zipinfo
/usr/bin/zipnote
/usr/bin/zipsplit 

如果搜尋要求沒有這麼簡單,locate 可以結合其它工具,比如說 grep 命令,來設計更加 有趣的搜尋:

[me@linuxbox ~]$ locate zip | grep bin
/bin/bunzip2
/bin/bzip2
/bin/bzip2recover
/bin/gunzip
/bin/gzip
/usr/bin/funzip
/usr/bin/gpg-zip
/usr/bin/preunzip
/usr/bin/prezip
/usr/bin/prezip-bin
/usr/bin/unzip
/usr/bin/unzipsfx
/usr/bin/zip
/usr/bin/zipcloak
/usr/bin/zipgrep
/usr/bin/zipinfo
/usr/bin/zipnote
/usr/bin/zipsplit 

這個 locate 程式已經存在了很多年了,它有幾個不同的變體被普遍使用著。在現在 Linux 發行版中發現的兩個最常見的變體是 slocate 和 mlocate,但是通常它們被名為 locate 的 符號連結訪問。不同版本的 locate 命令擁有重複的選項集合。一些版本包括正規表示式 匹配(我們會在下一章中討論)和萬用字元支援。檢視 locate 命令的手冊,從而確定安裝了 哪個版本的 locate 程式。

locate 資料庫來自何方?

你可能注意到了,在一些發行版中,僅僅在系統安裝之後,locate 不能工作, 但是如果你第二天再試一下,它就工作正常了。怎麼回事呢?locate 資料庫由另一個叫做 updatedb 的程式建立。通常,這個程式作為一個 cron 工作例程週期性運轉;也就是說,一個任務 在特定的時間間隔內被 cron 守護程式執行。大多數裝有 locate 的系統會每隔一天執行一回 updatedb 程式。因為資料庫不能被持續地更新,所以當使用 locate 時,你會發現 目前最新的檔案不會出現。為了克服這個問題,可以手動執行 updatedb 程式, 更改為超級使用者身份,在提示符下執行 updatedb 命令。

find - 查詢檔案的複雜方式

locate 程式只能依據檔名來查詢檔案,而 find 程式能基於各種各樣的屬性, 搜尋一個給定目錄(以及它的子目錄),來查詢檔案。我們將要花費大量的時間學習 find 命令,因為 它有許多有趣的特性,當我們開始在隨後的章節裡面討論程式設計概念的時候,我們將會重複看到這些特性。

find 命令的最簡單使用是,搜尋一個或多個目錄。例如,輸出我們的家目錄列表。

[me@linuxbox ~]$ find ~ 

對於最活躍的使用者帳號,這將產生一張很大的列表。因為這張列表被髮送到標準輸出, 我們可以把這個列表管道到其它的程式中。讓我們使用 wc 程式來計算出檔案的數量:

[me@linuxbox ~]$ find ~ | wc -l
47068 

哇,我們一直很忙!find 命令的美麗所在就是它能夠被用來識別符合特定標準的檔案。它透過 (有點奇怪)應用選項,測試條件,和操作來完成搜尋。我們先看一下測試條件。

Tests

比如說我們想要目錄列表。我們可以新增以下測試條件:

[me@linuxbox ~]$ find ~ -type d | wc -l
1695 

新增測試條件-type d 限制了只搜尋目錄。相反地,我們使用這個測試條件來限定搜尋普通檔案:

[me@linuxbox ~]$ find ~ -type f | wc -l
38737 

這裡是 find 命令支援的普通檔案型別測試條件:

表18-1: find 檔案型別
檔案型別 描述
b 塊裝置檔案
c 字元裝置檔案
d 目錄
f 普通檔案
l 符號連結

我們也可以透過加入一些額外的測試條件,根據檔案大小和檔名來搜尋:讓我們查詢所有檔名匹配 萬用字元模式“*.JPG”和檔案大小大於1M 的檔案:

[me@linuxbox ~]$ find ~ -type f -name "\*.JPG" -size +1M | wc -l
840 

在這個例子裡面,我們加入了 -name 測試條件,後面跟萬用字元模式。注意,我們把它用雙引號引起來, 從而阻止 shell 展開路徑名。緊接著,我們加入 -size 測試條件,後跟字串“+1M”。開頭的加號表明 我們正在尋找檔案大小大於指定數的檔案。若字串以減號開頭,則意味著查詢小於指定數的檔案。 若沒有符號意味著“精確匹配這個數”。結尾字母“M”表明測量單位是兆位元組。下面的字元可以 被用來指定測量單位:

表18-2: find 大小單位
字元 單位
b 512 個位元組塊。如果沒有指定單位,則這是預設值。
c 位元組
w 兩個位元組的字
k 千位元組(1024個位元組單位)
M 兆位元組(1048576個位元組單位)
G 千兆位元組(1073741824個位元組單位)

find 命令支援大量不同的測試條件。下表是列出了一些常見的測試條件。請注意,在需要數值引數的 情況下,可以應用以上討論的“+”和”-“符號表示法:

表18-3: find 測試條件
測試條件 描述
-cmin n 匹配的檔案和目錄的內容或屬性最後修改時間正好在 n 分鐘之前。 指定少於 n 分鐘之前,使用 -n,指定多於 n 分鐘之前,使用 +n。
-cnewer file 匹配的檔案和目錄的內容或屬性最後修改時間早於那些檔案。
-ctime n 匹配的檔案和目錄的內容和屬性最後修改時間在 n\*24小時之前。
-empty 匹配空檔案和目錄。
-group name 匹配的檔案和目錄屬於一個組。組可以用組名或組 ID 來表示。
-iname pattern 就像-name 測試條件,但是不區分大小寫。
-inum n 匹配的檔案的 inode 號是 n。這對於找到某個特殊 inode 的所有硬連結很有幫助。
-mmin n 匹配的檔案或目錄的內容被修改於 n 分鐘之前。
-mtime n 匹配的檔案或目錄的內容被修改於 n\*24小時之前。
-name pattern 用指定的萬用字元模式匹配的檔案和目錄。
-newer file 匹配的檔案和目錄的內容早於指定的檔案。當編寫 shell 指令碼,做檔案備份時,非常有幫助。 每次你製作一個備份,更新檔案(比如說日誌),然後使用 find 命令來決定自從上次更新,哪一個檔案已經更改了。
-nouser 匹配的檔案和目錄不屬於一個有效使用者。這可以用來查詢 屬於刪除帳戶的檔案或監測攻擊行為。
-nogroup 匹配的檔案和目錄不屬於一個有效的組。
-perm mode 匹配的檔案和目錄的許可權已經設定為指定的 mode。mode 可以用 八進位制或符號表示法。
-samefile name 相似於-inum 測試條件。匹配和檔案 name 享有同樣 inode 號的檔案。
-size n 匹配的檔案大小為 n。
-type c 匹配的檔案型別是 c。
-user name 匹配的檔案或目錄屬於某個使用者。這個使用者可以透過使用者名稱或使用者 ID 來表示。

這不是一個完整的列表。find 命令手冊有更詳細的說明。

運算子

即使擁有了 find 命令提供的所有測試條件,我們還需要一個更好的方式來描述測試條件之間的邏輯關係。例如, 如果我們需要確定是否一個目錄中的所有的檔案和子目錄擁有安全許可權,怎麼辦呢? 我們可以查詢許可權不是0600的檔案和許可權不是0700的目錄。幸運地是,find 命令提供了 一種方法來結合測試條件,透過使用邏輯運算子來建立更復雜的邏輯關係。 為了表達上述的測試條件,我們可以這樣做:

[me@linuxbox ~]$ find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \) 

呀!這的確看起來很奇怪。這些是什麼東西?實際上,這些運算子沒有那麼複雜,一旦你知道了它們的原理。 這裡是運算子列表:

表18-4: find 命令的邏輯運算子
運算子 描述
-and 如果運算子兩邊的測試條件都是真,則匹配。可以簡寫為 -a。 注意若沒有使用運算子,則預設使用 -and。
-or 若運算子兩邊的任一個測試條件為真,則匹配。可以簡寫為 -o。
-not 若運算子後面的測試條件是真,則匹配。可以簡寫為一個感嘆號(!)。
() 把測試條件和運算子組合起來形成更大的表示式。這用來控制邏輯計算的優先順序。 預設情況下,find 命令按照從左到右的順序計算。經常有必要重寫預設的求值順序,以得到期望的結果。 即使沒有必要,有時候包括組合起來的字元,對提高命令的可讀性是很有幫助的。注意 因為圓括號字元對於 shell 來說有特殊含義,所以在命令列中使用它們的時候,它們必須 用引號引起來,才能作為實參傳遞給 find 命令。通常反斜槓字元被用來轉義圓括號字元。

透過這張運算子列表,我們重建 find 命令。從最外層看,我們看到測試條件被分為兩組,由一個 -or 運算子分開:

( expression 1 ) -or ( expression 2 ) 

這很有意義,因為我們正在搜尋具有不同許可權集合的檔案和目錄。如果我們檔案和目錄兩者都查詢, 那為什麼要用 -or 來代替 -and 呢?因為 find 命令掃描檔案和目錄時,會計算每一個物件,看看它是否 匹配指定的測試條件。我們想要知道它是具有錯誤許可權的檔案還是有錯誤許可權的目錄。它不可能同時符合這 兩個條件。所以如果展開組合起來的表示式,我們能這樣解釋它:

( file with bad perms ) -or ( directory with bad perms ) 

下一個挑戰是怎樣來檢查“錯誤許可權”,這個怎樣做呢?我們不從這個角度做。我們將測試 “不是正確許可權”,因為我們知道什麼是“正確許可權”。對於檔案,我們定義正確許可權為0600, 目錄則為0711。測試具有“不正確”許可權的檔案表示式為:

-type f -and -not -perms 0600 

對於目錄,表示式為:

-type d -and -not -perms 0700 

正如上述運算子列表中提到的,這個-and 運算子能夠被安全地刪除,因為它是預設使用的運算子。 所以如果我們把這兩個表示式連起來,就得到最終的命令:

find ~ ( -type f -not -perms 0600 ) -or ( -type d -not -perms 0700 ) 

然而,因為圓括號對於 shell 有特殊含義,我們必須轉義它們,來阻止 shell 解釋它們。在圓括號字元 之前加上一個反斜槓字元來轉義它們。

邏輯運算子的另一個特性要重點理解。比方說我們有兩個由邏輯運算子分開的表示式:

expr1 -operator expr2 

在所有情況下,總會執行表示式 expr1;然而由運算子來決定是否執行表示式 expr2。這裡 列出了它是怎樣工作的:

表18-5: find AND/OR 邏輯
expr1 的結果 運算子 expr2 is...
-and 總要執行
-and 從不執行
-or 從不執行
-or 總要執行

為什麼這會發生呢?這樣做是為了提高效能。以 -and 為例,我們知道表示式 expr1 -and expr2 不能為真,如果表示式 expr1的結果為假,所以沒有必要執行 expr2。同樣地,如果我們有表示式 expr1 -or expr2,並且表示式 expr1的結果為真,那麼就沒有必要執行 expr2,因為我們已經知道 表示式 expr1 -or expr2 為真。好,這樣會執行快一些。為什麼這個很重要? 它很重要是因為我們能依靠這種行為來控制怎樣來執行操作。我們會很快看到…

預定義的操作

讓我們做一些工作吧!從 find 命令得到的結果列表很有用處,但是我們真正想要做的事情是操作列表 中的某些條目。幸運地是,find 命令允許基於搜尋結果來執行操作。有許多預定義的操作和幾種方式來 應用使用者定義的操作。首先,讓我們看一下幾個預定義的操作:

表18-6: 幾個預定義的 find 命令操作
操作 描述
-delete 刪除當前匹配的檔案。
-ls 對匹配的檔案執行等同的 ls -dils 命令。並將結果傳送到標準輸出。
-print 把匹配檔案的全路徑名輸送到標準輸出。如果沒有指定其它操作,這是 預設操作。
-quit 一旦找到一個匹配,退出。

和測試條件一樣,還有更多的操作。檢視 find 命令手冊得到更多細節。在第一個例子裡, 我們這樣做:

find ~ 

這個命令輸出了我們家目錄中包含的每個檔案和子目錄。它會輸出一個列表,因為會預設使用-print 操作 ,如果沒有指定其它操作的話。因此我們的命令也可以這樣表述:

find ~ -print 

我們可以使用 find 命令來刪除符合一定條件的檔案。例如,來刪除副檔名為“.BAK”(這通常用來指定備份檔案) 的檔案,我們可以使用這個命令:

find ~ -type f -name '*.BAK' -delete 

在這個例子裡面,使用者家目錄(和它的子目錄)下搜尋每個以.BAK 結尾的檔名。當找到後,就刪除它們。


警告:當使用 -delete 操作時,不用說,你應該格外小心。首先測試一下命令, 用 -print 操作代替 -delete,來確認搜尋結果。


在我們繼續之前,讓我們看一下邏輯運算子是怎樣影響操作的。考慮以下命令:

find ~ -type f -name '*.BAK' -print 

正如我們所見到的,這個命令會查詢每個檔名以.BAK (-name ‘*.BAK’) 結尾的普通檔案 (-type f), 並把每個匹配檔案的相對路徑名輸出到標準輸出 (-print)。然而,此命令按這個方式執行的原因,是 由每個測試和操作之間的邏輯關係決定的。記住,在每個測試和操作之間會預設應用 -and 邏輯運算子。 我們也可以這樣表達這個命令,使邏輯關係更容易看出:

find ~ -type f -and -name '*.BAK' -and -print 

當命令被充分表達之後,讓我們看看邏輯運算子是如何影響其執行的:

測試/行為 只有...的時候,才被執行
-print 只有 -type f and -name '*.BAK'為真的時候
-name ‘*.BAK’ 只有 -type f 為真的時候
-type f 總是被執行,因為它是與 -and 關係中的第一個測試/行為。

因為測試和行為之間的邏輯關係決定了哪一個會被執行,我們知道測試和行為的順序很重要。例如, 如果我們重新安排測試和行為之間的順序,讓 -print 行為是第一個,那麼這個命令執行起來會截然不同:

find ~ -print -and -type f -and -name '*.BAK' 

這個版本的命令會列印出每個檔案(-print 行為總是為真),然後測試檔案型別和指定的副檔名。

使用者定義的行為

除了預定義的行為之外,我們也可以喚醒隨意的命令。傳統方式是透過 -exec 行為。這個 行為像這樣工作:

-exec command {} ; 

這裡的 command 就是指一個命令的名字,{}是當前路徑名的符號表示,分號是要求的界定符 表明命令結束。這裡是一個使用 -exec 行為的例子,其作用如之前討論的 -delete 行為:

-exec rm '{}' ';' 

重述一遍,因為花括號和分號對於 shell 有特殊含義,所以它們必須被引起來或被轉義。

也有可能互動式地執行一個使用者定義的行為。透過使用 -ok 行為來代替 -exec,在執行每個指定的命令之前, 會提示使用者:

find ~ -type f -name 'foo*' -ok ls -l '{}' ';'
< ls ... /home/me/bin/foo > ? y
-rwxr-xr-x 1 me    me 224 2007-10-29 18:44 /home/me/bin/foo
< ls ... /home/me/foo.txt > ? y
-rw-r--r-- 1 me    me 0 2008-09-19 12:53 /home/me/foo.txt 

在這個例子裡面,我們搜尋以字串“foo”開頭的檔名,並且對每個匹配的檔案執行 ls -l 命令。 使用 -ok 行為,會在 ls 命令執行之前提示使用者。

提高效率

當 -exec 行為被使用的時候,若每次找到一個匹配的檔案,它會啟動一個新的指定命令的例項。 我們可能更願意把所有的搜尋結果結合起來,再執行一個命令的例項。例如,而不是像這樣執行命令:

ls -l file1
ls -l file2 

我們更喜歡這樣執行命令:

ls -l file1 file2 

這樣就導致命令只被執行一次而不是多次。有兩種方法可以這樣做。傳統方式是使用外部命令 xargs,另一種方法是,使用 find 命令自己的一個新功能。我們先討論第二種方法。

透過把末尾的分號改為加號,就啟用了 find 命令的一個功能,把搜尋結果結合為一個引數列表, 然後執行一次所期望的命令。再看一下之前的例子,這個:

find ~ -type f -name 'foo*' -exec ls -l '{}' ';'
-rwxr-xr-x 1 me     me 224 2007-10-29 18:44 /home/me/bin/foo
-rw-r--r-- 1 me     me 0 2008-09-19 12:53 /home/me/foo.txt 

會執行 ls 命令,每次找到一個匹配的檔案。把命令改為:

find ~ -type f -name 'foo*' -exec ls -l '{}' +
-rwxr-xr-x 1 me     me 224 2007-10-29 18:44 /home/me/bin/foo
-rw-r--r-- 1 me     me 0 2008-09-19 12:53 /home/me/foo.txt 

雖然我們得到一樣的結果,但是系統只需要執行一次 ls 命令。

xargs

這個 xargs 命令會執行一個有趣的函式。它從標準輸入接受輸入,並把輸入轉換為一個特定命令的 引數列表。對於我們的例子,我們可以這樣使用它:

find ~ -type f -name 'foo\*' -print | xargs ls -l
-rwxr-xr-x 1 me     me 224 2007-10-29 18:44 /home/me/bin/foo
-rw-r--r-- 1 me     me 0 2008-09-19 12:53 /home/me/foo.txt 

這裡我們看到 find 命令的輸出被管道到 xargs 命令,反過來,xargs 會為 ls 命令構建 引數列表,然後執行 ls 命令。


注意:當被放置到命令列中的引數個數相當大時,引數個數是有限制的。有可能建立的命令 太長以至於 shell 不能接受。當命令列超過系統支援的最大長度時,xargs 會執行帶有最大 引數個數的指定命令,然後重複這個過程直到耗盡標準輸入。執行帶有 –show–limits 選項 的 xargs 命令,來檢視命令列的最大值。


處理古怪的檔名

類 Unix 的系統允許在檔名中嵌入空格(甚至換行符)。這就給一些程式,如為其它 程式構建引數列表的 xargs 程式,造成了問題。一個嵌入的空格會被看作是一個界定符,生成的 命令會把每個空格分離的單詞解釋為單獨的引數。為了解決這個問題,find 命令和 xarg 程式 允許可選擇的使用一個 null 字元作為引數分隔符。一個 null 字元被定義在 ASCII 碼中,由數字 零來表示(相反的,例如,空格字元在 ASCII 碼中由數字32表示)。find 命令提供的 -print0 行為, 則會產生由 null 字元分離的輸出,並且 xargs 命令有一個 –null 選項,這個選項會接受由 null 字元 分離的輸入。這裡有一個例子:

find ~ -iname ‘*.jpg’ -print0 | xargs –null ls -l

使用這項技術,我們可以保證所有檔案,甚至那些檔名中包含空格的檔案,都能被正確地處理。

返回操練場

到實際使用 find 命令的時候了。我們將會建立一個操練場,來實踐一些我們所學到的知識。

首先,讓我們建立一個包含許多子目錄和檔案的操練場:

[me@linuxbox ~]$ mkdir -p playground/dir-{00{1..9},0{10..99},100}
[me@linuxbox ~]$ touch playground/dir-{00{1..9},0{10..99},100}/file-{A..Z} 

驚歎於命令列的強大功能!只用這兩行,我們就建立了一個包含一百個子目錄,每個子目錄中 包含了26個空檔案的操練場。試試用 GUI 來建立它!

我們用來創造這個奇蹟的方法中包含一個熟悉的命令(mkdir),一個奇異的 shell 擴充套件(大括號) 和一個新命令,touch。透過結合 mkdir 命令和-p 選項(導致 mkdir 命令建立指定路徑的父目錄),以及 大括號展開,我們能夠建立一百個目錄。

這個 touch 命令通常被用來設定或更新檔案的訪問,更改,和修改時間。然而,如果一個檔名引數是一個 不存在的檔案,則會建立一個空檔案。

在我們的操練場中,我們建立了一百個名為 file-A 的檔案例項。讓我們找到它們:

[me@linuxbox ~]$ find playground -type f -name 'file-A' 

注意不同於 ls 命令,find 命令的輸出結果是無序的。其順序由儲存裝置的佈局決定。為了確定實際上 我們擁有一百個此檔案的例項,我們可以用這種方式來確認:

[me@linuxbox ~]$ find playground -type f -name 'file-A' | wc -l 

下一步,讓我們看一下基於檔案的修改時間來查詢檔案。當建立備份檔案或者以年代順序來 組織檔案的時候,這會很有幫助。為此,首先我們將建立一個參考檔案,我們將與其比較修改時間:

[me@linuxbox ~]$ touch playground/timestamp 

這個建立了一個空檔案,名為 timestamp,並且把它的修改時間設定為當前時間。我們能夠驗證 它透過使用另一個方便的命令,stat,是一款加大馬力的 ls 命令版本。這個 stat 命令會展示系統對 某個檔案及其屬性所知道的所有資訊:

[me@linuxbox ~]$ stat playground/timestamp
File: 'playground/timestamp'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 803h/2051d Inode: 14265061 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1001/ me) Gid: ( 1001/ me)
Access: 2008-10-08 15:15:39.000000000 -0400
Modify: 2008-10-08 15:15:39.000000000 -0400
Change: 2008-10-08 15:15:39.000000000 -0400 

如果我們再次 touch 這個檔案,然後用 stat 命令檢測它,我們會發現所有檔案的時間已經更新了。

[me@linuxbox ~]$ touch playground/timestamp
[me@linuxbox ~]$ stat playground/timestamp
File: 'playground/timestamp'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 803h/2051d Inode: 14265061 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1001/ me) Gid: ( 1001/ me)
Access: 2008-10-08 15:23:33.000000000 -0400
Modify: 2008-10-08 15:23:33.000000000 -0400
Change: 2008-10-08 15:23:33.000000000 -0400 

下一步,讓我們使用 find 命令來更新一些操練場中的檔案:

[me@linuxbox ~]$ find playground -type f -name 'file-B' -exec touch '{}' ';' 

這會更新操練場中所有名為 file-B 的檔案。接下來我們會使用 find 命令來識別已更新的檔案, 透過把所有檔案與參考檔案 timestamp 做比較:

[me@linuxbox ~]$ find playground -type f -newer playground/timestamp 

搜尋結果包含所有一百個檔案 file-B 的例項。因為我們在更新了檔案 timestamp 之後, touch 了操練場中名為 file-B 的所有檔案,所以現在它們“新於”timestamp 檔案,因此能被用 -newer 測試條件識別出來。

最後,讓我們回到之前那個錯誤許可權的例子中,把它應用於操練場裡:

[me@linuxbox ~]$ find playground \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \) 

這個命令列出了操練場中所有一百個目錄和二百六十個檔案(還有 timestamp 和操練場本身,共 2702 個) ,因為沒有一個符合我們“正確許可權”的定義。透過對運算子和行為知識的瞭解,我們可以給這個命令 新增行為,對實戰場中的檔案和目錄應用新的許可權。

[me@linuxbox ~]$ find playground \( -type f -not -perm 0600 -exec chmod 0600 '{}' ';' \)
   -or \( -type d -not -perm 0711 -exec chmod 0700 '{}' ';' \) 

在日常的基礎上,我們可能發現執行兩個命令會比較容易一些,一個操作目錄,另一個操作檔案, 而不是這一個長長的複合命令,但是很高興知道,我們能這樣執行命令。這裡最重要的一點是要 理解怎樣把運算子和行為結合起來使用,來執行有用的任務。

選項

最後,我們有這些選項。這些選項被用來控制 find 命令的搜尋範圍。當構建 find 表示式的時候, 它們可能被其它的測試條件和行為包含:

表 18-7: find 命令選項
選項 描述
-depth 指導 find 程式先處理目錄中的檔案,再處理目錄自身。當指定-delete 行為時,會自動 應用這個選項。
-maxdepth levels 當執行測試條件和行為的時候,設定 find 程式陷入目錄樹的最大級別數
-mindepth levels 在應用測試條件和行為之前,設定 find 程式陷入目錄數的最小級別數。
-mount 指導 find 程式不要搜尋掛載到其它檔案系統上的目錄。
-noleaf 指導 find 程式不要基於搜尋類 Unix 的檔案系統做出的假設,來最佳化它的搜尋。

擴充閱讀

  • 程式 locate,updatedb,find 和 xargs 都是 GNU 專案 findutils 軟體包的一部分。 這個 GUN 專案提供了大量的線上文件,這些文件相當出色,如果你在高安全性的 環境中使用這些程式,你應該讀讀這些文件。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26250550/viewspace-1792152/,如需轉載,請註明出處,否則將追究法律責任。

相關文章