locate
locate 根據事先構建的索引庫進行查找文件,索引庫會再每天系統空閒時自動構建。
特性:模糊匹配,查找速度快,非實時查找,有可能返回之前已經刪除的文件或者新建的文件無法被查找到,因爲索引還沒有被創建。
locate [options] pattern...
命令 | 作用 |
---|---|
-b | 只匹配 basename |
-c | 返回查找到多少個符合條件的項 |
-r | 可以給予正則表達式查找 |
構建索引的過程需要遍歷整個根路徑,非常消耗系統資源。
find
實時查找工具,通過遍歷指定的路徑下的文件系統進行查找,速度比locate
略慢。
find path [options] [-COMMAND | -exec COMMAND {}\; | -ok COMMAND {}\; ]
options
是由選項和測試條件組成,測試條件如果爲真,則返回匹配結果。
選項 | 作用 |
---|---|
-name {pattern} -iname {pattern} |
根據文件名查找文件,pattern 匹配基於glob 風格的表達式,iname 忽略大小寫 |
-regex pattern | 基於正則表達式查找文件,匹配的是整個路徑,而非 basename |
-user username -group groupname -uid userid -gid groupid nouser nogroup |
根據文件的屬主、屬組、屬主id、屬組id查找。 nouser、nogroup用於查找沒有屬主、屬組的文件 如果將用戶刪了,則原來屬於該用戶的文件的屬主就沒有了,就變成了nouser/nogroup的文件,這時候文件的屬主屬組屬性會顯示爲原來屬主屬組的id,沒有屬主、屬組的文件是很可怕的,因爲如果後面有新增的用戶 id 恰好和已經刪除的用戶 id 相同,則這些文件就默認以新增用戶爲屬主了。所以可以通過 find / -nouser 查找沒有屬主的文件,方便排查。 |
-type | 根據文件類型查找 d: 目錄 f: 管道文件 b: 塊文件 c:字符文件 l: 符號鏈接文件 p:管道文件 s: 套接字文件 |
-a -o -not |
與或非,用來做組合測試條件,默認情況下是-a ,也可以通過括號來提升條件表達式的優先級。 |
-size [+|-]#UNIT | # 表示數字,UNIT 表示單位k 、M 、G find . -size 30M 表示精確查找大小在區間(30-1, 30] 內符合條件的文件find . -size +30M 表示查獲找大於 30M 到正無窮大的文件find . -size -30M 表示查找大小在區間[0,30-1]內符合條件的文件 |
-atime [+|-]# -mtime [+|-]# -ctime [+|-]# |
根據時間戳查找,以天爲單位 |
-amin [+|-]# -cmin [+|-]# -mmin [+|-]# |
根據時間戳查找,以分鐘爲單位 |
-perm [/|-] mode | + 已棄用,find新版使用-perm /mode 來代替-perm +mode -perm 666 精確匹配666 權限的文件,需要注意精確匹配包括特殊權限位(suid/sgid/sticky)-perm /222 任何一類用戶(ugo )中的任何一個權限位符合條件的文件,搜尋權限爲-rwxr-xr-x 的文件,亦即-perm +755 時,但屬性爲-rw------- 也會被列出來,因有-rw 的屬性存在!-perm -222 : 權限大於等於對應八進制權限位的文件。詳細點說就是9個 權限位上爲1 的權限位一定要完全符合,爲0 的部分隨意。查找的文件權限『必須要全部囊括mode的權限』,舉例來說,搜索-rwxr--r-- ,即權限爲0744 的文件,使用-perm -0744 ,當文件的權限爲-rwsr-xr-x ,即4755 時,也會被列出來,因爲-rwsr-xr-x 的屬性已經囊括了-rwxr--r-- 的屬性了 |
組合測試條件示例
ll
#total 0
#-rw-rw-r--. 1 1006 1007 0 Jun 14 03:57 user1.test
#-rw-rwxr--+ 1 user2 group1 0 Jun 14 04:03 user2.sgid.test
#-rw-rw-r--. 1 user2 user2 0 Jun 14 03:57 user2.test
# 查找user開頭並且有屬主的文件
find . -name "user*" -a -not -nouser
#./user2.test
#./user2.sgid.test
# 查找包含 sgid , 或者沒有屬主的文件
find . -name "*sgid*" -o -nouser
#./user1.test
#./user2.sgid.test
處理動作
-
直接
-
後面跟命令,默認-print
也可以使用
-ls
類似ls -l
輸出查詢的長信息使用
-delete
刪除查找到的文件使用
-fls file_path
將查找到的結果保存在到指定文件中 -
使用
-ok
後面跟命令格式
-ok COMMAND {} \;
對查找到的每個文件執行由COMMAND
表示的命令# 查找當前目錄下沒有屬主的文件,將其屬主數組都改爲root find . -nouser -ok chown root:root {} \;
-
使用
-exec
後面跟命令格式
-exec COMMAND {} \;
對查找到的每個文件執行由COMMAND
表示的命令
-ok
和-exec
之間的區別:-ok
所有的命令需要進行一一提示確認,而exec
直接執行,沒有確認的環節。
find
傳遞查找到的文件路徑到後面的命令時,是先查找到所有符合條件的文件路徑,並一次性傳遞給後面的命令,但是有些命令不能接收過長的參數,此時命令執行失敗,通過使用find | xargs COMMAND
可以規避此問題。