linux find詳解(轉)

zhanglincon發表於2009-04-28
find之強大毋庸置疑,此處只是帶領大家一窺find門徑,更詳細的說明見man find和 info find。
整篇文章循序漸進,從最常用的檔名測試項開始步步深入,到第六節基本講完find處理檔案的規則,再之後的章節是一些常用表示式的說明。
(此篇中所有選項及例子基於GNU find version 4.2.28)

(一)Get Start
最簡單的find用法莫過於如此:
$ find .
查詢當前目錄下的所有檔案。
find命令的一般格式為:
find [-H] [-L] [-P] [path...] [expression]

其中,'-H' '-L' '-P'三個選項主要是用來處理符號連線,'-H'表示只跟隨命令列中指定的符號連線,'-L'表示跟隨所有的符號連線,'-P'是預設的選項,表示不跟隨符號連線。
例如,在我的當前目錄下有一個符號連線e1000,現在我想查詢檔名中最後一個字母是數字的原始檔,那麼
$ find -H . -name "*[0-9].c" -print
./2234.c
像上面這樣寫只能查詢出當前目錄下符合要求的檔案,卻找不出e1000下的檔案。因此可以這麼寫:
$ find -H e1000 . -name "*[0-9].c" -print
或者使用 '-L'選項
$ find -L . -name "*[0-9].c" -print

格式中的[path...]部分表示以此目錄為根目錄進行搜尋。

格式中的[expression]是一個表示式。最基本的表示式分為三類:設定項(option)、測試項(test)、動作項(action),這三類又可以通過邏輯運算子(operator)組合在一起形成更大更復雜的表示式。設定項(如-depth,-maxdepth等)針對這次查詢任務,而不是僅僅針對某一個檔案,設定項總是返回true;測試項(test)則不同,它針對具體的一個檔案進行匹配測試,如-name,-num,-user等,返回true或者false;動作項(action)則是對某一個檔案進行某種動作(最常見的如-print),返回true或者false。
正是[expression]部分的豐富,才使得find如此強大。此部分較複雜,後面慢慢說明。


(二)檔名
根據檔名來查詢一個檔案是大家經常遇到的事情,第一節中的'-name'正是解決此問題的。
-name屬於表示式中的測試項(test),它按照檔名模式來匹配檔案,若匹配則返回true,否則返回false。最好用引號將檔名模式引起來,防止shell自己解析要匹配的字串。(可以用單引號也可以用雙引號,單引號和雙引號在shell環境中的區別見後續部分)
例如,想要的當前目錄及子目錄中查詢檔名以一個大寫字母開頭或者以小寫a或b開頭的檔案,可以用:
$ find . -name "[A-Za-b]*" -print
./a_book_of_c.chm
./TMP1234
如果想在當前目錄查詢檔名不以大寫字母開頭,之後跟一個小寫字母,再之後是兩個數字,最後是.txt的檔案,可以這麼用:
$ find . -name "[^A-Z][a-z][0-9][0-9].txt" -print
./@y38.txt
注意:此處的模式匹配並不符合正規表示式。

-name對大小寫字母敏感,如果想匹配時不考慮大小寫可以使用-iname測試項。'i'可以加在許多選項前面,比如-ipath,-iregex,-iwholename等等,都是表示大小寫不敏感。


(三)正規表示式
使用上面的-name測試項能解決許多問題,但是有些還是不太好辦,比如:查詢當前目錄下名稱全部為數字的c原始碼檔案,這時就該'-regex'出手了。正規表示式絕對值得你去好好研究一下,在unix系統下太有用了,這裡不做過多說明,請讀者自行學習。
-regex 同樣屬於測試項。使用-regex時有一點要注意:-regex不是匹配檔名,而是匹配完整的檔名(包括路徑)。例如,當前目錄下有一個檔案"abar9",如果你用"ab.*9"來匹配,將查詢不到任何結果,正確的方法是使用".*ab.*9"或者".*/ab.*9"來匹配。
針對上面的那個查詢c程式碼的問題,可以這麼寫:
$ find . -regex ".*/[0-9]*\.c" -print
./2234.c

還有一個設定項(option)'-regextype',可以讓你根據自己的喜好選擇使用的正規表示式型別,大家可以試試。


(四)wholename與path
既然上一節提到了完整檔名(包括路徑名),那麼這裡不妨說一下-wholename和-path。
-wholename和-path都屬於測試項(test),而且功能也一樣。-path從字面上看給人一種錯覺,好像只匹配路徑名(或者目錄名),其實它也可以匹配檔名,因此-wholename這個名字更貼切一些。
看看這個例子,當前目錄下有一個phone目錄,phone目錄裡有一個檔名稱是puk.txt,使用-path:
$ find . -path '*phone/pu*'
./phone/puk.txt

另外要提一點:使用-path的一般格式是:find [path ...] -path pattern ...
它的意思是:在[path ...]部分指明的路徑上,使用pattern匹配所有檔案的完整檔名;而不是說在類似的pattern目錄下查詢檔案。


(五)邏輯運算子
有了上面三個選項,你現在應該對檔名的相關匹配得心應手了,對於不是很複雜的查詢應該也勝任了。但是看看這個例子,解釋一下它在做什麼?
$ find . -size +0c -wholename "*e*[0-9]*" -o ! \( -name "." -o -name "*phone" \) -prune -name "*.c" -user xixi -o -name "*phone"
下面是當前目錄下的所有檔案:
$ ls -l
total 224
-rw-r--r-- 1 xixi admin      0 2007-11-01 17:34 0dfe.c
-rw-r--r-- 1 abc admin      0 2007-10-30 15:56 0s8a.txt
-rw-r--r-- 1 abc admin      0 2007-11-04 01:00 0TMP123
-rw-r--r-- 1 abc admin     73 2007-11-05 15:33 2234.c
-rw-r--r-- 1 abc admin     72 2007-11-05 15:34 3e10.c
-rw------- 1 abc admin 224017 2006-03-16 12:16 a_book_of_c.chm
lrwxrwxrwx 1 abc admin     15 2007-11-04 11:48 e1000 -> ../e1000-7.6.9/
-rw-r--r-- 1 abc admin     70 2007-11-05 14:57 e100.dat
lrwxrwxrwx 1 abc admin     13 2007-11-05 14:59 e100puk.txt -> phone/puk.txt
-rw-r--r-- 1 abc admin      0 2007-11-06 22:21 e680phone
drwxr-xr-x 2 abc admin     37 2007-11-06 22:24 phone
drwxr-xr-x 2 abc admin     20 2007-11-07 01:07 phone1
drwxr-xr-x 2 abc admin      6 2007-11-05 15:37 phone2
-rw-r--r-- 1 abc admin     67 2007-11-04 12:23 @y38.txt

phone$ ls -l
total 4
-rw-r--r-- 1 abc admin 0 2007-11-06 22:24 e680gphone
-rw------- 1 abc admin 38 2007-11-05 14:58 puk.txt

phone1$ ls -l
total 0
-rw-r--r-- 1 xixi admin 0 2007-11-07 01:07 hello.c

phone2$ ls -l
total 0


要想解決上面的問題就得學習一下find中的邏輯運算子。邏輯運算子主要有以下幾個,按照優先順序從高到低的順序如下:
( expr )
括號優先順序最高,首先對括號內的求值
! expr
對expr表示式的值取反
-not expr
同上,但是POSIX不支援
expr1 expr2
不加任何運算子,相當於兩個之間加and,即與運算,兩個表示式值都為true整個才返回true。先對expr1表示式求值,若為false,則不對expr2求值。
expr1 -a expr2
同上
expr1 -and expr2
同上,但是POSIX不支援
expr1 -o expr2
表示對expr1和expr2兩個表示式的值求或,左右兩個值只要有一個為ture,整個表示式就是true。先對expr1表示式求值,若為ture,則不對expr2求值。
expr1 -or expr2
同上,但是POSIX不支援
expr1 , expr2
逗號表示式。expr1和expr2都會求值,但是隻返回expr2的值,expr1的值會被丟棄

正是因為有一個求值的順序,所以你才有可能見到這樣的寫法:
$ find . -name "*.txt" -o -print
表示,如果表示式-name "*.txt"為真,就不再執行另一個表示式-print,即查詢所有不是以.txt結尾的檔案。

再有,要查詢當前目錄下,檔名中包括字母'e',在'e'之後又有數字的不是目錄檔案的所有檔案,可以這麼寫:
$ find . -name "*e*[0-9]*" ! -type d -print
./e1000
./e100.dat
./e100puk.txt
./3e10.c
大家可以自己多舉幾個例子試一下。


(六)-prune
-prune是一個動作項,它表示當檔案是一個目錄檔案時,不進入此目錄進行搜尋。
要理解-prune動作,首先得理解find命令的搜尋規則(也可以說find命令的演算法)。
find命令遞迴遍歷所指定的目錄樹,針對每個檔案依次執行find命令中的表示式,表示式首先根據邏輯運算子進行結合,然後依次從左至右對錶達式求值。以下面程式碼為例,進行說明
find PATHP1 OPT1 TEST1 ACT1 ( TEST2 or TEST3 ) ACT2
(1) 根據OPT1設定項進行find命令的整體設定,若沒有-depth設定項,依次進行下面的步驟
(2) 令檔案變數File = PATHP1
(3) 對File檔案進行TEST1測試,若執行結果為false,轉(8)
(4) 對File檔案進行ACT1動作,若執行結果為false,轉(8)
(5) 對File檔案進行TEST2測試,若執行結果為true,轉(7)
(6) 對File檔案進行TEST3測試,若執行結果為false,轉(8)
(7) 對File檔案進行ACT2動作
(8) 若File檔案是一個目錄,並且沒有被執行過-prune動作,則進入此目錄
(9) 當前目錄下是否還有檔案,若有依次取一個檔案,令File指向此檔案,轉(3);
(10) 判斷當前目錄是否是PATHP1,若是則程式退出;若不是,則返回上一層目錄,轉(9)

理解了上面的流程,那麼不難理解下面的程式碼為什麼只輸出一個'.'
$ find . -prune
.
再有,當前目錄下大於4090位元組的檔案有兩個,而大於4096位元組的檔案只有一個,如下:
$ find . -size +4090c -print
.
./a_book_of_c.chm

$ find . -size +4096c -print
./a_book_of_c.chm
那麼,將上面兩個-print都替換為-prune,這兩條命令分別輸出什麼?
$ find . -size +4090c -prune
.
$ find . -size +4096c -prune
./a_book_of_c.chm
這就是答案,如果你答對了,恭喜你,你已經掌握了find命令!

-prune經常和-path或-wholename一起使用,以避開某個目錄,常見的形式是:
$ find PATH (-path -o -path ) -prune -o -path

注意:如果同時使用-depth設定項,那麼-prune將被find命令忽略。man手冊頁中這麼說:"If -depth is given, false; no effect."
說到這裡,又得說說-depth設定項。網上好多資料說-depth設定項的功能是“在查詢檔案時,首先查詢當前目錄中的檔案,然後再在其子目錄中查詢”,這明顯是錯誤的,man手冊頁中如是說:"-depth Process each directory's contents before the directory itself."。這有點像樹的後序遍歷,先遍歷當前節點的所有子節點,然後再訪問當前節點...
考考你:
下面的命令輸出什麼?為什麼?
$ find . -depth -prune -name "*.c" -print


(七)時間戳
理解了上面幾節,你已經掌握了find命令的“道” ^_^ ,下面這幾節只是介紹一些常用、好用的“招式”。這一節介紹時間戳。

檔案有三個時間屬性:建立時間、最近修改時間、最近訪問時間。
最近修改時間又包括兩種,一是檔案的狀態(也即許可權如rwx等)最近被修改時間,一是檔案的資料(也即內容)最近被修改時間。touch命令改變的即是檔案資料最近被修改時間。
最近訪問時間,指的是最近一次檔案資料(內容)被訪問的時間。因此,使用ls命令輸出檔案的相關資訊並不會修改檔案的最近訪問時間。

find命令提供了針對檔案的最近訪問時間、檔案狀態最近被修改時間、檔案資料最近被修改時間進行匹配的測試項,分別是-amin, -cmin, -mmin和-atime, -ctime, -mtime兩組,第一組基於分鐘,第二組基於天。
以-amin為例,假設當前時間tnow="2007-11-12 14:42:10"、t1="2007-11-12 14:39:10"、t2="2007-11-12 14:40:10",那麼要查詢最近訪問時間屬於[t1,t2]時間段的檔案,可以這麼寫:
$ find . -amin 3

若測試項引數是數字,則基本上都可以在數字引數前加"+"或者"-"號,表示“大於”或“小於”的意思,因此,要查詢最近訪問時間屬於[t1,tnow]時間段的檔案,可以這麼寫:
$ find . -amin -3

"-amin n"和"-atime n"的處理方法都是:根據當前時間和檔案的相應時間屬性求n值,然後比較n值和引數n,看是否符合要求。但是這個求n值的過程卻有很大不同,他們的不同也代表了兩組(基於分鐘和基於天)的不同:
"-amin n"
1、求Δt,用當前時間減去檔案對應屬性的時間值即得到Δt,Δt = tnow - tfile;
2、求浮點數f,用Δt除以1分鐘,f = Δt / 1min;
3、將f的小數部分入到整數部分,得到n。即,不管f是6.0102還是6.8901,n都等於7
"-atime n"
1、求Δt,用當前時間減去檔案對應屬性的時間值即得到Δt,Δt = tnow - tfile;
2、求浮點數f,用Δt處以24小時,f = Δt / 24hours;
3、將f的小數部分都舍掉,得到n。即,不管f是6.0102還是6.8901,n都等於6
大家可以多做實驗,試一下。


(八)許可權位
很多人都在用windows,從windows系統拷過來的檔案經常被加上了可執行許可權,比如我現在想把主目錄下所有的字尾名為.txt .pdf .rm並且具有可執行許可權位的檔案查詢出來,該怎麼寫呢?
這裡就不得不說一說許可權位測試項:-perm。-perm支援符號許可權位表示法也支援絕對(八進位制)許可權位表示法,但是最好使用八進位制的許可權表示法(這只是個建議 ^_^ )。
-perm基本上有下面這幾中形式:
-perm mode       File's permission bits are exactly mode.
-perm -mode     All of the permission bits mode are set for the file.
-perm /mode     Any of the permission bits mode are set for the file.
-perm +mode (此形式已經不推薦使用,功能與/mode相同)
好好理解上面藍色部分,理解了,-perm測試項也就掌握了。
考考你:
看看下面這句話是什麼意思?
find . -perm -444 -perm /222 ! -perm /111

現在再來解決本節最開始提出的問題:查詢主目錄下所有的字尾名為.txt .pdf .rm並且具有可執行許可權位的檔案。
$ find ~ \( -name "*.txt" -o -name "*.pdf" -o -name "*.rm" \) \
   -not \( -type d -o -type l \) \
   -perm /111 -print


(九)檔案型別
有一個問題:我只想查詢符號連線檔案,可是查詢結果中卻包括了普通檔案、目錄檔案等等,不相關的東西太多了,怎麼把不是符號連線檔案的查詢結果去掉?
-type測試項剛好可以滿足你的要求,-type c即可,其中c表示檔案型別,find中支援如下型別:
              b      block (buffered) special
              c      character (unbuffered) special
              d      directory
              p      named pipe (FIFO)
              f       regular file
              l       symbolic link;
              s      socket
              D     door (Solaris)
針對上面的問題,可以這麼寫:
$ find . -name "e100*" -type l -print
./e1000
./e100puk.txt
但是,不要這麼寫:
$ find -L . -name "e100*" -type l -print
加上'-L'選項之後,你將查不到需要的東西,除非符號連線已經失效了。


(十)檔案大小
前面一再使用-size測試項,這裡簡單介紹一下。
-size測試項根據檔案的大小查詢檔案,檔案大小既可以用塊(block)來計量,也可以用位元組來計量。預設情況下以塊計量檔案大小,若想使用位元組來計量只需要在數字引數後加c即可。find支援的其他計量方式有:
-size n[cwbkMG],分別表示
              ‘b’    for 512-byte blocks (this is the default if no suffix is used)
              ‘c’    for bytes
              ‘w’    for two-byte words
              ‘k’    for Kilobytes (units of 1024 bytes)
              ‘M’    for Megabytes (units of 1048576 bytes)
              ‘G’    for Gigabytes (units of 1073741824 bytes)


(十一)使用者、使用者組
根據使用者、使用者組來查詢檔案,這個沒有太多要說的,記住命令格式即可:
-uid n
-user username or uid
-nouser
-gid n
-group gname or gid
-nogroup


(十二)輸出格式
如果你不想查詢到你想要的檔案事單調的輸出檔名,你可以使用-printf動作項輸出你想要的格式,下面舉幾個-printf動作的引數:
%p    輸出檔名,包括路徑名
%f     輸出檔名,不包括路徑名
%m    以8進位制方式輸出檔案的許可權
%g    輸出檔案所屬的組
%h    輸出檔案所在的目錄名
%u    輸出檔案的屬主名
...
例如:
$ find . -user xixi -printf "%m %p \\n"
644 ./phone1/hello.c
644 ./0dfe.c

其餘的,看man手冊頁吧。


(十三)執行外部命令
這又是一個很容易出彩的地方。find真是強大,對查詢到的檔案竟然可以呼叫外部命令進行處理。-exec動作項就是來完成這個功能的,格式是:
find . EXPR1 -exec command ...{} \;
注意:後一個花括號'}'和'\'之間有一個空格。
例如,查詢當前目錄下的所有普通檔案,並用ls命令輸出:
find . -type f -exec ls -l {} \;
有些作業系統中出於安全考慮只允許-exec選項執行諸如l s或ls -l這樣的命令。
也可以使用-exec動作項的安全模式:-ok動作項。它的功能和語法都跟-exec一樣,只不過它以更安全的模式執行,當要刪除檔案時,它會給出提示,讓你選擇到底刪除還是不刪。
例如:
$ find logs -name "*abc*" -ok rm {} \;

使用-exec動作項處理匹配到的檔案時,find命令會將所有匹配到的檔案一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令執行幾分鐘之後,就會出現溢位錯誤。錯誤資訊通常是“引數列太長”或“引數列溢位”。這就是xargs命令的用處所在,特別是與find命令一起使用。
xargs的使用格式是:
find PATH EXPR1 EXPR2 | xargs command
利用管道,把find命令匹配到的檔名傳遞給xargs命令,而xargs命令每次只獲取一部分檔案而不是全部。這樣它可以先處理最先獲取的一部分檔案,然後是下一批,並如此繼續下去。
在有些系統中,使用-exec動作項會為處理每一個匹配到的檔案而發起一個相應的程式,並非將匹配到的檔案全部作為引數一次執行;這樣在有些情況下就會出現程式過多,系統效能下降的問題,因而效率不高;而使用xargs命令則只有一個程式。另外,在使用xargs命令時,究竟是一次獲取所有的引數,還是分批取得引數,以及每一次獲取引數的數目都會根據該命令的選項及系統核心中相應的可調引數來確定。
例如,要在普通檔案中查詢檔案內容中包含"io"的檔案,可以這麼寫:
$ find . -type f | xargs grep "io"
Binary file ./a_book_of_c.chm matches
./2234.c:#include
./3e10.c:#include
find命令配合exec和xargs可以對所匹配到的檔案執行幾乎所有的命令。

(十四)總結
理解並運用find,關鍵是掌握find命令的處理規則(見第五節):遞迴遍歷所指定的目錄樹,針對每個檔案依次執行find命令中的表示式,表示式首先根據邏輯運算子進行結合,然後依次從左至右對錶達式求值。把這個理解了,需要什麼功能查一下man就可以了。

find命令還有好多功能這裡沒有涉及到,具體的大家看man手冊頁吧。在任何時候,man都是一個極好的幫助工具。   ^_^

(十五)附
第五節提出的問題,答案如下:
$ find . -size +0c -wholename "*e*[0-9]*" -o   \
         ! \( -name "." -o -name "*phone" \) -prune -name "*.c" -user xixi   \
         -o -name "*phone"
./e1000
./e100.dat
./phone
./phone/e680gphone
./e100puk.txt
./3e10.c
./phone1
./phone1/hello.c
./phone2
./0dfe.c
./e680phone


這篇文章斷斷續續寫了好久,今天終於基本完工。參考了man手冊頁以及一些網上的資料。
要把自己心中所想有條理的寫出來感覺真是不易,希望對大家有所幫助。
歡迎批評指正。

Linux下find命令例項
$find ~ -name "*.txt" -print    #在$HOME中查.txt檔案並顯示
$find .     -name "*.txt" -print
$find .     -name "[A-Z]*" -pri26nbsp;     #對匹配的檔案使用cpio命令,將他們備份到磁帶裝置中-prune                                #忽略某個目錄
$find .     -name "[A-Z]*" -print #查以大寫字母開頭的檔案
$find /etc -name "host*" -print #查以host開頭的檔案
$find . -name "[a-z][a-z][0--9][0--9].txt"     -print #查以兩個小寫字母和兩個數字開頭的txt檔案
$find . -perm 755 -print
$find . -perm -007 -exec ls -l {} \; #查所有使用者都可讀寫執行的檔案同-perm 777
$find . -type d -print 列印目錄結構
$find . ! -type d -print   列印非目錄檔案
find /usr/include -name '*.h' -exec grep AF_INEF6 {} \;
因grep無法遞迴搜尋子目錄,故可以和find相結合使用。 在/usr/include 所有子目錄中的.h檔案中找字串AF_INEF6

$find . -type l -print
$find . -size +1000000c -print       #查長度大於1Mb的檔案
$find . -size 100c       -print        # 查長度為100c的檔案
$find . -size +10 -print             #查長度超過期作廢10塊的檔案(1塊=512位元組)
$cd /
$find etc home apps     -depth -print | cpio -ivcdC65536 -o /dev/rmt0
$find /etc -name "passwd*" -exec grep "cnscn" {} \; #看是否存在cnscn使用者
$find . -name "yao*" | xargs file
$find . -name "yao*" | xargs echo     "" > /tmp/core.log
$find . -name "yao*" | xargs chmod o-w


find -name april*                      在當前目錄下查詢以april開始的檔案
find -name april* fprint file       在當前目錄下查詢以april開始的檔案,並把結果輸出到file中
find -name ap* -o -name may* 查詢以ap或may開頭的檔案
find /mnt -name tom.txt -ftype vfat 在/mnt下查詢名稱為tom.txt且檔案系統型別為vfat的檔案
find /mnt -name t.txt ! -ftype vfat     在/mnt下查詢名稱為tom.txt且檔案系統型別不為vfat的檔案
find /tmp -name wa* -type l          在/tmp下查詢名為wa開頭且型別為符號連結的檔案
find /home -mtime -2                在/home下查最近兩天內改動過的檔案
find /home     -atime -1                    查1天之內被存取過的檔案
find /home -mmin     +60                    在/home下查60分鐘前改動過的檔案
find /home -amin +30                    查最近30分鐘前被存取過的檔案
find /home -newer tmp.txt             在/home下查更新時間比tmp.txt近的檔案或目錄
find /home -anewer tmp.txt              在/home下查存取時間比tmp.txt近的檔案或目錄
find /home -used -2                    列出檔案或目錄被改動過之後,在2日內被存取過的檔案或目錄
find /home -user cnscn                列出/home目錄內屬於使用者cnscn的檔案或目錄
find /home -uid +501                列出/home目錄內使用者的識別碼大於501的檔案或目錄
find /home -group cnscn             列出/home內組為cnscn的檔案或目錄
find /home -gid 501                   列出/home內組id為501的檔案或目錄
find /home -nouser                   列出/home內不屬於本地使用者的檔案或目錄
find /home -nogroup                   列出/home內不屬於本地組的檔案或目錄
find /home     -name tmp.txt     -maxdepth 4 列出/home內的tmp.txt 查時深度最多為3層
find /home -name tmp.txt -mindepth 3 從第2層開始查
find /home -empty                       查詢大小為0的檔案或空目錄
find /home -size +512k                 查大於512k的檔案
find /home -size -512k                 查小於512k的檔案
find /home -links +2                查硬連線數大於2的檔案或目錄
find /home -perm 0700                查許可權為700的檔案或目錄
find /tmp -name tmp.txt -exec cat {} \;
find /tmp -name tmp.txt -ok rm {} \;
find     / -amin     -10       # 查詢在系統中最後10分鐘訪問的檔案
find     / -atime -2           # 查詢在系統中最後48小時訪問的檔案
find     / -empty             # 查詢在系統中為空的檔案或者資料夾
find     / -group cat       # 查詢在系統中屬於 groupcat的檔案
find     / -mmin -5           # 查詢在系統中最後5分鐘裡修改過的檔案
find     / -mtime -1       #查詢在系統中最後24小時裡修改過的檔案
find     / -nouser             #查詢在系統中屬於作廢使用者的檔案
find     / -user     fred       #查詢在系統中屬於FRED這個使用者的檔案

更多資訊可以檢視:《Linux下find命令詳解http://www.phpq.net/linux/linux-find.html、《Linux下find命令例項http://www.phpq.net/linux/linux-find-demo.html

查當前目錄下的所有普通檔案
# find . -type f -exec ls -l {} \;
-rw-r--r--    1 root    root       34928 2003-02-25 ./conf/httpd.conf
-rw-r--r--    1 root    root       12959 2003-02-25 ./conf/magic
-rw-r--r--    1 root    root          180 2003-02-25 ./conf.d/README
查當前目錄下的所有普通檔案,並在- e x e c選項中使用ls -l命令將它們列出

在/logs目錄中查詢更改時間在5日以前的檔案並刪除它們:
$ find logs -type f -mtime +5 -exec -ok rm {} \;

查詢當天修改過的檔案
[root@book class]# find ./ -mtime -1 -type f -exec ls -l {} \;

查詢檔案並詢問是否要顯示
[root@book class]# find ./ -mtime -1 -type f -ok ls -l {} \;  
< ls ... ./classDB.inc.php > ? y
-rw-r--r--    1 cnscn    cnscn       13709 1月 12 12:22 ./classDB.inc.php
[root@book class]# find ./ -mtime -1 -type f -ok ls -l {} \;  
< ls ... ./classDB.inc.php > ? n
[root@book class]#
查詢並交給awk去處理
[root@book class]# who | awk '{print $1"\t"$2}'
cnscn     pts/0

awk---grep---sed
[root@book class]# df -k | awk '{print $1}' | grep -v 'none' | sed s"/\/dev\///g"
檔案系統
sda2
sda1
[root@book class]# df -k | awk '{print $1}' | grep -v 'none'
檔案系統
/dev/sda2
/dev/sda1

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

相關文章