Linux下find命令提供了相當多的查找條件,功能很強大,但是不到萬不得已的時候是不會用它來查找文件的,因爲它存在兩個缺陷:一是查找速度慢,二是費硬盤。
通常情況下,我們都是先使用whereis或者locate來查找,如果真的找不到了,才用find來查找。這裏需要明白一點的是linux系統會將系統內的所有文件都記錄在一個數據庫文件中,當使用whereis和locate時,會從數據庫中查找數據,而不是像find命令那樣,通過遍歷硬盤來查找。但是該數據庫文件並不是實時更新的,默認情況下是一星期更新一次,因此,我們在用whereis和locate 查找文件時,有時會發現已經被增添的數據或者剛剛建立的文件,卻無法查找到,原因就是因爲數據庫文件沒有被更新。
明白上面的道理後,總結一下,find指令查找實時有效,但效率慢,不到萬不得已的情況下儘量用whereis或locate指令;而whereis和locate查找文件效率高,但也存在一些限制(whereis命令只能用於程序名的搜索,而且只搜索二進制文件),有時會出現文件存在卻查詢不到的情況。
好了,回到主題上來,由於find具有強大的功能,所以它的選項也很多,其中大部分選項都值得我們花時間來了解一下。即使系統中含有網絡文文件系統( NFS),find命令在該文件系統中同樣有效,只要你具有相應的權限。 在運行一個非常消耗資源的find命令時,很多人都傾向於把它放在後臺執行,因爲遍歷一個大的文件系統可能會花費很長的時間(這裏是指30G字節以上的文件系統)。下面就來說一下find的用法:
1.命令格式:
find pathname -options [-print -exec -ok ...]
2.命令功能:
用於在文件樹中查找文件,並作出相應的處理(可能訪問磁盤)
3.命令參數:
(1) pathname: find命令所查找的目錄路徑。例如用 . 來表示當前目錄,用 / 來表示系統根目錄。
(2)-print: find命令將匹配的文件輸出到標準輸出。
(3) -exec: find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式爲'command' { } \; 注意{ }和\;之間的空格,{ }指的是之前find找出的所有的文件。
(4)-ok: 和-exec的作用相同,只不過以一種更爲安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。
4.命令選項:
(1) -name :按照文件名查找文件(精確查找);-iname不區分文件名大小寫進行查找(用法:find -iname test.c).
(2)-perm:按照文件權限來查找文件;
(查找到的文件很多,644表示 u-rw ,g-r,o-r權限)
(3)-prune: 使用這一選項可以使find命令不在當前指定的目錄中查找,如果同時使用-depth選項,那麼-prune將被find命令忽略。
(4)-user: 按照文件屬主來查找文件;
(5)-group: 按照文件所屬的組來查找文件;
(6)-nogroup: 查找無有效所屬組的文件,即該文件所屬的組在/etc/groups中不存在;
(7)-nouser: 查找無有效屬主的文件,即該文件的屬主在/etc/passwd中不存在;
(8)-mtime -n +n 按照文件的更改時間來查找文件, - n表示文件更改(指文件內容的更改)時間距現在n天以內,+ n表示文件更改時間距現在n天以前;
(9)find命令還有-atime和-ctime 選項,但它們都和-mtime選項相同;
(10)-newer file1 ! -newer file2: 查找更改時間比文件file1新但比文件file2舊的文件;
(11)-type 查找某種類型的文件;
諸如:b -- 塊設備文件;d -- 目錄;c
-- 字符設備文件;p -- 管道文件;l -- 符號鏈接文件;f
-- 普通文件。
之前有提到過-type得用法,下面再嘗試兩個:
(12)-size n:[c] 查找文件長度爲n塊的文件,帶有c時表示文件長度以字節計;還可以這樣查找,find -size +256k ,表示搜尋當前目錄下(含子目錄)大於256k的文件; find -size -256k ,表示搜尋當前目錄下(含子目錄)小於256k的文件。
(13)-depth:在查找文件時,首先查找當前指定目錄中的文件,然後再在其子目錄中查找;上面有介紹過-prune可以使find命令不在當前指定的目錄中查找,而這兩個命令同時使用時-prune被忽略(find /bin -depth -prune).
順便提一句,可使用 ls -al / 命令來查看Linux系統的目錄結構。
-mindepth n :搜索深度距離當前目錄至少n個子目錄深度 ;
-maxdepth n : 搜索深度距離當前目錄最多n個子目錄深度 。
(14)-fstype:查找位於某種類型文件系統中的文件,這些文件系統類型通常可以在配置文件/etc/fstab中找到,該配置文件中包含了本系統中有關文件系統的信息;
(15)-mount:在查找文件時不跨越文件系統mount點;
(16)-follow:如果find命令遇到符號鏈接文件,就跟蹤至鏈接所指向的文件;
(17)-cpio:對匹配的文件使用cpio命令,將這些文件備份到磁帶設備中;
(18)-empty:搜索當前路徑下爲空的文件或目錄。
下面嘗試一下命令的混合用法:
1. 按時間來查找文件,-n指n天以內,+n指n天以前;在/tmp目錄中查找更改時間在5天以前的文件並刪除它們:
2. Linux用find命令查找文件大小爲XX的文件,-nc代表小於n個字節,+nc代表大於n個字節
例如:一個文件1303個字節,可以這樣:即查找大於1302字節而小於1304字節的文件。其中的c也可以換爲k,代表kB:
在使用find命令時,還需瞭解以下幾個小知識:
(1)文件名通配知識
*表示 通配任意的字符;
?表示通配任意的單個字符;
[]表示通配括號裏面的任意字符;[]裏面的內容會被解析成單個字符 。
(2)正則表達式查找
!:非條件;
-a :與條件(-and);
-o :或條件(-or),連接兩個不同的條件(兩個條件滿足其一即可)
-not 非條件(與“!”相同,對條件取反)
總之,find指令非常多也非常的重要,需要我們不斷地去學習和總結,今天就先介紹這些!