檔案尋找命令之locate,find,locatefind
檔案尋找
在檔案系統上尋找合格檔案
檔案尋找命令:
locate:非即時尋找( 資料庫尋找)
find:即時尋找
locate:
查詢系統上預建的檔案索引資料庫
/var/lib/mlocate/mlocate.db
依賴於事先構建的索引
索引的構建是在系統較為空白閑時自動進行( 周期性 任務),管理員 手動更新資料庫(updatedb)
索引構建過程需要遍曆整個根檔案系統,極消耗資源
工作特點:
• 尋找速度快
• 模糊尋找
• 非即時尋找
• 搜尋的是檔案的全路徑,不僅僅是檔案名稱
• 可能只搜尋使用者具備讀取和執行許可權的目錄
locate 命令
locate KEYWORD
-i:執行不區分大小寫搜尋
-n N:只列舉前N 個匹配項目
-b:只匹配路徑中的基名
-c:只顯示統計多少個合格路徑
-r:能基於基本Regex來編寫命令
locate foo
• 搜尋名稱或路徑中帶有“foo ”的檔案
locate -r ‘.foo$’
• 使用Regex 來搜尋以“.foo ”結尾的檔案
find
即時尋找工具,通過遍曆指定路徑完成檔案尋找;
工作特點:
• 尋找速度略慢
• 精確尋找
• 即時尋找
• 可能只搜尋使用者具備讀取和執行許可權的目錄
用法:
find [OPTION]... [ 尋找路徑] [ 尋找條件] [ 處理動作]
尋找路徑:
指定具體目標路徑,預設為目前的目錄
尋找條件:
指定的尋找標準,可以檔案名稱、大小、類型、許可權等標準進行;預設為找出指定路徑下的所有檔案
處理動作:
對合格檔案做操作,預設輸出至螢幕
尋找條件
運算式:選項和測試
根據檔案名稱和inode 尋找:
-name " 檔案名稱":支援使用glob *, ?, [], [^]
-iname " 檔案名稱":不區分字母大小寫
-inum n:按inode 號尋找
-samefile name:相同inode 號的檔案
-links n:連結數為n 的檔案
-regex "PATTERN":以PATTERN(Regex)匹配整個檔案路徑字串,而不僅僅是檔案名稱ID
根據屬主、屬組尋找:
-user USERNAME:尋找屬主為指定使用者(UID) 的檔案
-group GRPNAME:尋找屬組為指定組(GID) 的檔案
-uid UserID:尋找屬主為指定的U識別碼的檔案
-gid GroupID:尋找屬組為指定的G識別碼的檔案
-nouser:尋找沒有屬主的檔案
-nogroup:尋找沒有屬組的檔案
根據檔案類型尋找:
-type TYPE
f:普通檔案
d:目錄檔案
l:符號連結檔案
s:通訊端檔案
b:塊裝置檔案
c:字元裝置檔案
p:管道檔案
組合條件:
與:-a
或:-o
非:-not !
德· 摩根 定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
樣本:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
find 樣本
find -name snow.png
搜尋名為snow.png 的檔案
find -iname A.png
不分大小寫尋找名為A.png 、a.png、 A.PNG 等等的檔案
find / -name “.txt”
尋找根目錄下尾碼名為txt的檔案
find /var –name "log*"
尋找var目錄下包含log的檔案
find -user test -group test
搜尋被使用者test 以及組群test所擁有的檔案
其它樣本:
find -user test -not -group test
find -user test -o -user test
find -not ( -user test -o -user test )
find / -user test -o -uid 500
找出/tmp 目錄下,屬主不是root ,且 檔案名稱 不以f 開頭的 檔案
find /tmp ( -not -user root -a -not -name 'f' ) -ls
find /tmp -not ( -user root -o -name 'f' ) –ls
排除目錄
樣本:尋找/etc/ 下,除/etc/sane.d 目錄的其它所有.conf 尾碼的檔案
find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf” -print
根據檔案大小來尋找:
-size [+,-]#unit
常用單位:k, M, G
如:6k 表示(5k,6k]
-#unit :[0到#-1]
如:-6k 表示[0到5k]
+#unit :(#和大於#)
如:+6k 表示(6k或大於6k )
根據時間戳記
以天為單位(time):
-atime [+|-]# 訪問時間
+#:表示(#+1)天之外被訪問
-#:表示#天內被訪問過的
#:表示小於(#+1)大於或者#天的時間段被訪問過
-ctime:改變時間
-mtime:修改時間
以分鐘為單位(min)
-amin
-mmin
-cmin
根據許可權尋找:
-perm [+|-]MODE
MODE:精確匹配
+MODE:任何一類使用者的任何一位許可權匹配即可,常用於尋找某類用使用者的某特定許可權是否存在
-MODE:每類使用者的指定要檢查的許可權位都匹配
樣本:
find -perm 755,會匹配許可權模式恰好是755 的檔案
只要當任意人有寫入權限時,find -perm +222 就會匹配
只有當每個人都有寫入權限時,find -perm -222 才會匹配
只有當其它人(other )有寫入權限時,find -perm -002才會匹配
處理動作:
-print:預設,列印在標準輸出上
-ls:以長格式輸出各檔案資訊,類似於ls -l
-delete:刪除尋找到的檔案
-fls file:尋找到的所有檔案的長格式資訊儲存至指定檔案中
-exec COMMAND {} ;:對尋找到的檔案指定的命令
-ok COMMAND {} ;:互動式,對尋找到的每個檔案執行由COMMAND 指定的命令
find |xargs COMMAND: find把尋找到的所有檔案一次性地傳遞給-exec執行
{}:用於引用尋找到的檔案名稱自身
參數代換:xargs
用於產生某個命令的參數 xargs 入可以讀入stdin的資料,並且以空格符或斷行符號符將stdin的資料分隔成為arguments
注意:檔案名稱或者是其他意義的名詞內含有空格符的情況
有些命令不能接受過多參數 ,命令執行可能會失敗,xargs可以解決
樣本:
find | xargs COMMAND
find /sbin -perm +7000 | xargs ls -l
樣本:
find -name “*.conf” -exec cp {} {}.orig ;
備份設定檔,添加.orig 這個副檔名
find /tmp -ctime +3 -user joe -ok rm {} ;
提示刪除存在時間超過3天以上的joe 的臨時檔案
find ~ -perm -002 -exec chmod o-w {} ;
在你的主目錄中尋找可被其它使用者寫入的檔案
find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} ;
find /home –type d -ls