linux之文件查找locate/find

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表示單位kMG
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

處理動作

  1. 直接-後面跟命令,默認-print

    也可以使用-ls類似ls -l 輸出查詢的長信息

    使用-delete刪除查找到的文件

    使用-fls file_path將查找到的結果保存在到指定文件中

  2. 使用-ok後面跟命令

    格式-ok COMMAND {} \;對查找到的每個文件執行由COMMAND表示的命令

    # 查找當前目錄下沒有屬主的文件,將其屬主數組都改爲root
    find . -nouser -ok chown root:root {} \;
    
  3. 使用-exec後面跟命令

    格式-exec COMMAND {} \;對查找到的每個文件執行由COMMAND表示的命令

-ok-exec之間的區別:-ok所有的命令需要進行一一提示確認,而exec直接執行,沒有確認的環節。

find傳遞查找到的文件路徑到後面的命令時,是先查找到所有符合條件的文件路徑,並一次性傳遞給後面的命令,但是有些命令不能接收過長的參數,此時命令執行失敗,通過使用find | xargs COMMAND可以規避此問題。

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