Linux下的find指令

       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指令非常多也非常的重要,需要我們不斷地去學習和總結,今天就先介紹這些!




     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章