文本查找:grep egrep fgrep
檔案查找:locate、find
locate和find的差別
locate有自維護的資料庫(linux自建,與所有檔案關聯),每天linux會定時對其進行更新,而locate就在此資料庫中查找,是以查詢速度非常快,但是缺點也很明顯,不能實時查找(比如剛裝linux時這條指令是不能用的),支援的查找方式少。
find的優點和缺點與locate相對應,find 周遊指定的路徑,用以查找檔案,是以當指定路徑下的檔案數量越多,find的查找效率越低,但是find 支援查找的格式非常多,比如根據檔案名查找,元屬性狀态查找,還支援正則等等。
locate:
非實時,模糊比對,查找是根據全系統檔案資料庫進行的;
速度快
#updatedb,手動生成檔案資料庫
find:
實時
精确
支援衆多查找标準
周遊指定路徑中的所有檔案進行查找,速度慢
find 查找路徑 查找标準 查找到以後的操作
查找路徑:預設為目前路徑
查找(比對)标準:預設為指定路徑下的所有檔案
處理操作:預設為顯示
比對标準:
-name ‘filename’:對檔案名進行精确比對
檔案名通配:
*:任意長度的任意字元
?:單個長度的任意字元
[]:
...
-iname ’filename‘ 比對時忽略大小寫
-regex pattern :基于正規表達式對檔案進行比對
pattern必須用絕對路徑包含
-user username:根據屬主查找
-group groupname:根據屬組查找
-uid UID:根據uid查找
-gid GID:根據gid查找
-nouser:查找沒有屬主的檔案
-nogroup:查找沒有屬組的檔案
-type:
p:普通檔案
s:socket檔案
d:目錄檔案
p:管道檔案
l:連結檔案
...
-size
[+|-]#k:查找[大于|小于]#k的檔案
[+|-]#M:查找[大于|小于]#M的檔案
[+|-]#G:查找[大于|小于]#G的檔案
注意:find 指令裡面查找檔案大小并不是精确的,它會把大于上一個數到小于下一個數之間的數當成目前數,比如我們查找等于10k的檔案,那麼9.2k、9.31k、10.1k等等都會被當成10k而被比對到,而9k 11.1k等就不會
組合條件:
-a:與
-o:或
-not:非
-mtime:根據修改(modify)時間
-atime:通路(access)時間
-ctime:改變(change)時間
[+|-]#:+代表某個時間之前,-代表之後,time預設是天
(atime和ctime差別:atime修改資料,ctime修改元屬性)
-mmin:
-cmin:
-amin:
[+|-]#:
與time對應,min代表分鐘
-perm MODE:完全比對mode,比如755必須完全比對755
/MODE:部分比對mode,隻要一個比對就可以了,比如r--rw----,隻要這三個位置中其他一個被比對到就可以了,比如可以比對的有:r--------、rw-------等等
-MODE:完全包含比對,比對的mode必須等于或者可以包含MODE,比如r--rw----,那麼r--rwx---、rw-rw----等可以比對,而---rwxrwx、rwxr-xrwx等不可以比對
find 利用正則比對示例:
[root@logstash ~]# find /etc/ -regex "\<pas.*"
[root@logstash ~]# find /etc/ -regex "/etc/\<pas.*"
/etc/passwd
/etc/passwd-
處理操作:
-print:顯示
-ls:類似ls -l的格式顯示比對到的檔案的詳細資訊
-ok COMMAND {} \;每一次操作都需要使用者确認
-exec COMMAND {} \;
{}代表比對到的檔案,\;是固定結束符
xargs與find -exec示例
[root@localhost ~]# find /tmp/ -size -1M -exec echo {} >>tmp.txt \;
[root@localhost ~]# cat tmp.txt
/tmp/mysql.sock
/tmp/sess_e538a6cd81b0fed9d5c49f1b2f84dd80
/tmp/sess_c1f3bd3446ca4407d9a2a05bb4897030
[root@localhost ~]# find /tmp/ -size -1M |xargs echo {} >>tmp1.txt ;
[root@localhost ~]#
示例:
1、查找/var下屬主為root并且屬組為mail的所有檔案
find /var/ -user root -group mail
2、查找/usr不屬于root、bin或student的檔案
find /usr/ -not -user root -o -not -user bin -o -not -user student
find /usr/ -not \(-user root -o -user bin -o -user student \)
3、查找/etc下最近一周内内容修改過且不屬于root以及student使用者的檔案
find /etc/ -mtime -7 -not -user root -a -not -user student
find /etc/ -mtime -7 -not \(-user root -o -user student\)
4、查找目前系統上沒有屬組或屬主且最近1天内曾被通路過的檔案、并将其屬主屬組修改為root
find / -nouser -o -nogroup -a -ctime -1 -exec chown root:root {} \;
5、查找/etc/下大于1M的檔案,并寫入到/tmp/1.txt中
find /etc/ -size +1M -exec echo {} >>/tmp/1.txt \;
6、查找/etc/所有使用者都沒有寫權限的檔案,并顯示其詳細資訊
find /etc/ -not -perm /222 -ls
注意這裡是用/222 而不是-222
本文轉自biao007h51CTO部落格,原文連結: http://blog.51cto.com/linzb/1735061,如需轉載請自行聯系原作者