前言:數據庫
文件查找:ide
在文件系統上查找符合條件的文件;工具
這與grep是徹底不一樣的,grep是文本處理工具。find與locate是針對於文件的而不是文件中的文本內容。
ui
文件查找經常使用工具:locate, findspa
區別: 非實時查找(數據庫查找):locate操作系統
實時查找:findblog
locate:索引
locate的工做機制:ci
依賴於事先構建的索引庫;索引的構建是在系統較爲空閒時自動進行(週期性任務);手動更新數據庫(updatedb);資源
索引庫的構建方式通常有兩種:
系統自動實現;(系統在較爲空閒的時候自動進行(週期性的任務)),在操做系統剛裝完是沒有的。可是操做系統可能定義了一些任務在一段時間後會由某個程序實現自動構建。
手動更新數據庫使用updatedb這個命令。
索引構建過程須要遍歷整個根文件系統,極消耗資源;
locate索引庫的構建具體過程:
系統的週期性的任務程序會遍歷整個文件系統。生成一個由keyword和keword的文件路徑組成的 K-V數據庫,也就是索引庫。
但locate查找某個文件時。locate會去查找索引庫,並對keword進行模糊匹配。可是索引庫不是實時更新的。也就是說,若是A文件在索引庫此次更新和下次更新之間被刪除了。那麼locate能夠查到A文件,可是實際上A文件已經不存在了。你只能在下次索引庫更新後才能使用locate發現A文件不見了。強調一下,索引庫裏記錄的是文件路徑。也就是說locate查找獲得的結果是文件存在的路徑。
工做特色:
查找速度快;
模糊查找;
非實時查找;可能有部分結果不許確。
locate用法:
locate [OPTION]... PATTERN...
-A ,--all 同時知足全部的 PATTERN才能夠。
-b ,--basename只匹配路徑當中的基名。
-c,--count。不把查找結果顯示出來而是把複合條件數目的統計出來。
-r, 支持基本的正則表達。若不加則不支持。
find:
find工做機制:
實時查找工具,經過遍歷指定路徑下的文件系統完成文件查找;
工做特色:
查找速度略慢;
精確查找;
實時查找;
find語法:
find [OPTION]... [查找路徑] [查找條件] [處理動做]
查找路徑:指定具體目標路徑;默認爲當前目錄;
查找條件:指定的查找標準,能夠文件名、大小、類型、權限等標準進行;默認爲找出指定路徑下的全部文件;
處理動做:對符合條件的文件作什麼操做;默認輸出至屏幕;
查找條件:
根據文件名查找:
-name "文件名稱":支持使用glob風格。
*, ?, [], [^]
例子 find /etc/ -name
-iname "文件名稱":不區分字母大小寫
-regex "PATTERN":以PATTERN匹配整個文件路徑字符串,而不單單是文件名稱;
2.根據屬主、屬組查找:
-user USERNAME:查找屬主爲指定用戶的文件;
-group GRPNAME: 查找屬組爲指定組的文件;
-uid UserID:查找屬主爲指定的UID號的文件;
-gid GroupID:查找屬組爲指定的GID號的文件;
-nouser:查找沒有屬主的文件;
-nogroup:查找沒有屬組的文件;
3.根據文件類型查找:
-type TYPE:
f: 普通文件
d: 目錄文件
l: 符號連接文件
s:套接字文件
b: 塊設備文件
c: 字符設備文件
p: 管道文件
4.組合條件:
與:-a
或:-o
非:-not, !
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
找出/tmp目錄下,屬主不是root,且文件名不是fstab的文件; find /tmp -not -user root -a -not -name 'fstab' -ls find /tmp -not \( -user root -o -name 'fstab' \) -ls
5.根據文件大小來查找:
-size [+|-]#UNIT
經常使用單位:k, M, G
#UNIT: (#-1, #] 精確查找,例如:find /etc -size 5k 表示 查找文件大小爲大於4k小於等於5k的文件。(4,5]k
-#UNIT:[0,#-1] 例如:find /etc -size -5k 表示查找文件大小大於等於0k且小於等於4k的文件[0,5-1]k
+#UNIT:(#,oo)例如:find /etc -size +5k 表示查找文件大小大於5k的文件。(5k,+∞)
6.根據時間戳:
以「天」爲單位;
-atime 表示訪問時間 。[+|-]#。
a. #: [#,#+1) 例如:find /etc -atime 3 表示以如今查找的時間爲基準,過去[3×24小時,4×24)之間被訪問過的文件
如圖:
b. +#: [#+1,oo] 例如 :find /etc -atime +3 表示以如今查找的時間爲基準,過去4×24小時以前被訪問過的文件。包括從如今時刻以前的4×24小時這個時刻。
如圖:
c. -#: [0,#) 例如:find /etc -atime -3 表示以如今查找的時間爲基準,過去(3×24小時,0×24小時]包含如今時刻被訪問過的文件。就是3天內。
-mtime 表示修改時間
-ctime 表示改變時間
以「分鐘」爲單位:
-amin
-mmin
-cmin
用法同上。
總結幾個特殊的:
一天內 find /etc -atime 0 或者 find /etc -atime -1
一天前 find /etc -atime +0
兩天前 find /etc -atime +1
兩天內 find /etc -atime -2
6.根據權限查找:
-perm [/|-]MODE
a. MODE: 精確權限匹配 表示徹底精確匹配。
示例:查找/etc 下權限爲644的文件
find /etc -perm 644
b. /MODE:任何一類(u,g,o)用戶的任何一位(r,w,x)符合條件即知足;9個權限位只要有一個知足就知足。
示例:
查找/etc下至少一類用戶有寫權限。
find /etc -perm /222
查找/etc下全部用戶都沒有寫權限
find /etc -not -perm /222
查找/etc下至少一類用戶有執行權限。
find /etc -perm /111
查找/etc下其餘用戶有執行權限。
find /etc -perm /001
注意:這裏的0並非沒有任何權限的意思。而是指任意權限,不關心屬主和屬組的權限是什麼。只關心其餘用戶有x權限。
補充:在操做系統上其餘用戶有寫權限的文件是很危險的。不建議這麼設定。因此能夠 find /PATH/SONMEFILE -perm /002 找出來。
c. -MODE:每一類用戶(u,g,o)的權限中的每一位(r,wx)同時符合條件即知足;
示例:
查找/etc下每一類用戶都有寫權限的文件
find /etc -perm -222。
查找/etc下至少有一類用戶沒有寫權限的文件。
find /etc -not -perm -222。
特殊的:
查找/etc 下其餘用戶有寫權限的文件。
find /etc -perm /002 或者 find /etc -perm -002 兩者效果同樣的由於咱們不關心屬主和屬組的權限是什麼。
可是find /etc -perm /022 與 find /etc -perm -022 就不一樣了。前者表示屬組或者其餘用戶有寫權限。後者表示屬組與其餘用戶都有寫權限。
B. 處理動做:
-print:默認的處理動做,顯示至屏幕;
-ls:相似於對查找到的文件執行「ls -l」命令;
-delete:刪除查找到的文件;
-fls /path/to/somefile:查找到的全部文件的長格式信息保存至指定文件中;
-ok COMMAND {} \; 對查找到的每一個文件執行由COMMAND指定的命令;
對於每一個文件執行命令以前,都會交互式要求用戶確認;注意結尾的分號
-exec COMMAND {} \; 對查找到的每一個文件執行由COMMAND指定的命令;
{}: 用於引用查找到的文件名稱自身;注意結尾的分號
示例:
查找 /tmp 下其餘用戶有寫權限的文件並修改該文件文some.danger的格式
find /tmp -perm /002 -exec mv {} {}.danger \;
注意:find傳遞查找到的文件至後面指定的命令時,查找到全部符合條件的文件一次性傳遞給後面的命令;有些命令不能接受過多參數,此時命令執行可能會失敗;另外一種方式可規避此問題:
find | xargs COMMAND