Linux中的檔案檢視工具有兩種:find和locate。locate是非實時性的,不準确,是根據事先建立的資料庫來查找的,速度較快。find是根據檔案屬性資訊在系統中實時查找的,能精确的比對,可以指定路徑,檔案類型,可以根據檔案大小,屬組屬主,時間戳等查找,查找到檔案之後還可以做相應的操作。由于find的特點,在linux中應用非常廣泛,也非常重要。
一,find指令用法
find的使用格式為:find [dir...] [criteria...] [action]
如果不指定目錄,則預設為目前目錄
如果不指定條件,則預設為全部條件
如果不指定動作,則預設為顯示出來
ctiteria即條件常用的有:
-name "filename" 嚴格區分大小寫,查找指定的檔案名
例:find -name "test" 在目前目錄查找test檔案
-iname "filename" 不區分字母的大小寫
-regex "pattern" 對搜尋結果的整個路徑按正規表達式進行過濾,必須對全路徑考慮
例:find / -regex ".*/find" 查找根下檔案名是find的檔案
-user username 指定屬主
例:find /tmp -user root 查找tmp中屬主是root的檔案
-group groupname 指定屬組
例: find /tmp -group root 查找tmp中屬組是root的檔案
-uid 指定uid,查找屬主
-gid 指定gid,查找屬組
-nouser 查找所有沒有屬主的檔案
例:find /var/tmp -nouser
-nogroup 查找所有沒有屬組的檔案
注意:當一個使用者被删除之後,使用者先前建立的檔案,也就沒有了屬主屬組
-type 指定檔案的類型進行查找,後面可以跟:f:普通檔案;d:目錄檔案;l:連結檔案;b:塊裝置檔案;c:字元檔案;p:管道檔案;s:套接字檔案
例:find /tmp -type d 查找tmp中的目錄檔案
以上是基本的條件,而當我們需要多個條件的時候,可以用:(優先級:非>與>或)
-a 與 預設情況,不指定條件之間關系的話是“與”
例:find /tmp -iname "*lc*" -a -user root 查找tmp中檔案名中有lc字元并且屬主為root的檔案
-o 或
例:find /tmp -iname "*lc*" -o -user root 查找tmp中檔案名中有lc字元或是屬主為root的檔案
-not 非(也可使用!)對一個條件取反
例:find /tmp -not -iname "*lc*" -not -user root 查找tmp中檔案名不包含ls字元并且屬主不是root的檔案
find /tmp -not \( -iname "*lc*" -o -user root \) 主要括号中的空格;這兩個的意思是一樣的,你懂的...
-size 指定一個數值和機關,k,G,M,預設為位元組
例:find /tmp -size 10M 在/tmp中查找10M左右的檔案(上下波動不在1個機關内)
find /tmp -size +10M 查找大于10M的檔案
find /tmp -size -10M 查找小于10M的檔案
-amin 指定通路時間 機關分鐘
-mmin 指定修改時間 機關分鐘
-cmin 指定改變時間 機關分鐘
-atime 指定通路時間 機關是天
-mtime 指定修改時間 機關是天
-ctime 指定改變時間 機關是天
例:find /tmp -ctime 3 在tmp中查找在過去的第三天改變的檔案
find /tmp -mtime -3 在tmp中查找在過去的三天内修改的檔案
find /tmp -atime +3 在tmp中查找在過去至少三天沒有通路的檔案
-perm 根據檔案權限查找
例:find /tmp -perm 655 查找權限是655的檔案
find /tmp -perm +655 查找三類使用者權限中隻要有一類使用者的一位權限位符合條件就比對,即(屬主隻要有讀或寫權限)或是(屬組隻要有讀或執行權限)或是(其他使用者有讀或執行權限),這三個隻要有一個滿足就比對(0表示比對任何權限)
find /tmp -perm -655 三類使用者中的權限位必須都符合條件才比對,即檔案的權限必須是655(0表示比對任何權限)
action即動作:
-print 顯示比對的檔案,預設就是這個動作
-ls 顯示的時候用長格式顯示檔案的屬性資訊
例:find /tmp -type d -ls 查找tmp中目錄檔案,并列出其詳細資訊
-exec COMMAND {} \;查找到檔案後執行指令
例:find /tmp -name "a.txt" -exec rm {} \; 在tmp中查找到a.txt檔案後将其删除
-ok 與-exec不同的是會在執行操作前提示是否執行
-maxdepth 隻在第一層目錄中檢視,不進行遞歸查找
例:find /opt/www/ -maxdepth 1 -type f -exec rm -rf {} \; 隻會在/opt/www的第一層目錄中查找檔案,并删除
-wholename 後面能跟模式,比對find輸出檔案的完整的路徑資訊。從檔案整個路徑的/開始到這個檔案之間比對
例1:
[root@yd_82_231 ~]# find /root -wholename '/root*py'
/root/python/class.py
/root/python/check_redis.py
即find搜尋到的整個檔案路徑必須是:以/root開頭,以.py結尾
例2:
[root@yd_test ~]# find . -wholename './py*py'
./python/class.py
./python/check_redis.py
即find搜尋到的整個檔案路徑必須是:以.py開頭,以.py結尾
-prune 不搜尋指定的檔案
[root@yd_82_231 ~]# mkdir python
[root@yd_82_231 ~]# mkdir pythonnnn
[root@yd_82_231 ~]# find ./ -maxdepth 1 -path './python*' -prune -o -type d -print
./
./.python-eggs
./.ssh
目前目錄中以python開頭指令的所有目錄都會被忽略
例2:
[root@yd_test ~]# find ./ -maxdepth 1 -wholename './python*' -prune -o -type d -print
用-path和-wholename的效果用法是一樣的
二,find與xargs
在使用find指令的-exec選項處理比對到的檔案時, find指令将所有比對到的檔案一起傳遞給exec執行。但有些系統對能夠傳遞給exec的指令長度有限制,這樣在find指令運作幾分鐘之後,就會出現溢出錯誤。錯誤資訊通常是“參數列太長”或“參數列溢出”。這就是xargs指令的用處所在,特别是與find指令一起使用。
find指令把比對到的檔案傳遞給xargs指令,而xargs指令每次隻擷取一部分檔案而不是全部,不像-exec選項那樣。這樣它可以先處理最先擷取的一部分檔案,然後是下一批,并如此繼續下去。
在有些系統中,使用-exec選項會為處理每一個比對到的檔案而發起一個相應的程序,并非将比對到的檔案全部作為參數一次執行;這樣在有些情況下就會出現程序過多,系統性能下降的問題,因而效率不高;
而使用xargs指令則隻有一個程序。另外,在使用xargs指令時,究竟是一次擷取所有的參數,還是分批取得參數,以及每一次擷取參數的數目都會根據該指令的選項及系統核心中相應的可調參數來确定。
來看看xargs指令是如何同find指令一起使用的:
find . -type f -print | xargs file 查找系統中的每一個普通檔案,然後使用xargs指令來測試它們分别屬于哪類檔案
find / -name "core" -print | xargs echo "" >/tmp/core.log 在整個系統中查找記憶體資訊轉儲檔案(core dump) ,然後把結果儲存到/tmp/core.log 檔案中:
find . -type f -print | xargs grep "hostname" 用grep指令在所有的普通檔案中搜尋hostname這個詞
find ./ -mtime +3 -print|xargs rm -f –r 删除3天以前的所有東西 (find . -ctime +3 -exec rm -rf {} \;)
find ./ -size 0 | xargs rm -f & 删除檔案大小為零的檔案
find指令配合使用exec和xargs可以使使用者對所比對到的檔案執行幾乎所有的指令。
本文轉自 leejia1989 51CTO部落格,原文連結:http://blog.51cto.com/leejia/787168,如需轉載請自行聯系原作者