一、簡介
在文件系統上常常需要根據文件的各種屬性去查找符合條件的文件,文件查找工具有兩個,locate和find。
二、分類
文件查找分爲:
實時查找:遍歷所有文件進行條件匹配(find);
非實時查找:又叫數據庫查找,根據索引查找(locate);
三、locate
1.查詢系統上預建的文件索引數據庫:/var/lib/mlocate/mlocate.db;
2.依賴於事先構建的索引:
索引的構建是在系統空閒時由系統自動進行(週期性任務);管理員手動更新數據庫使用updatedb命令;
3.索引構建過程需要遍歷整個根文件系統,極消耗資源;
4.工作特點:
查找速度快、非精確查找、模糊查找、搜索的是文件全路徑,不僅僅是文件名、可能只搜索用戶具備讀取和執行權限的目錄;
5.格式:locate KEYWORD
搜索名稱或路徑帶有“issue”的文件
OPTION:
-i:忽略大小寫的搜索;
-n X:只列舉前X個匹配項目;
eg1:使用Regex來搜索以“.sh”結尾的文件
四、find
1.find屬於實時查找工具,通過遍歷指定路徑下的文件系統完成文件查找;
2.工作特點:
精確查找、查找速度略慢、可能只搜索用戶具備讀取和執行權限的目錄;
3.語法:find [OPTION]... [查找路徑] [查找條件] [處理動作]
查找路徑:制定具體目標路徑,默認爲當前目錄;
查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認爲找出指定路徑下的所有文件;
處理動作:對符合條件的文件做操作,默認輸出至屏幕;
4.查找條件
根據文件名和inode查找:
-name "文件名稱":支持使用glob *, ?, [], [^]
搜索名爲root的所有文件;
-iname "文件名稱":不區分字母大小寫
-inum n:按inode號查找
-samefile name:相同inode號的文件
-links n:鏈接數爲n的文件
-regex "PATTERN":以PATTERN匹配整個文件路徑字 符串,而不僅僅是文件名稱
根據屬主、屬組查找:
-user USERNAME:查找屬主爲指定用戶(UID)的文件
-group GRPNAME: 查找屬組爲指定組(GID)的文件
-uid UserID:查找屬主爲指定的UID號的文件
-gid GroupID:查找屬組爲指定的GID號的文件
-nouser:查找沒有屬主的文件
-nogroup:查找沒有屬組的文件
根據文件類型查找:
-type TYPE:
f: 普通文件
d: 目錄文件
l: 符號鏈接文件
s:套接字文件
b: 塊設備文件
c: 字符設備文件
p: 管道文件
根據組合條件查找:
與:-a
或:-o
非:-not,!,條件取反
德·摩根定律:
非(P 且 Q) = (非 P) 或 (非 Q)
非(P 或 Q) = (非 P) 且 (非 Q)
-not(A -a B)=-not A -o -not B:不是A或者不是B;
-not(A -o B)=-not A -a -not B:不是A也不是B;
eg1:查找屬主是tom且不是普通文件的文件;
eg2:查找屬主是tom和bash的所有文件;
eg3:查找屬主是tom且屬組不是tom的文件
eg4:查找屬主是tom或者屬主是bash的文件
eg5:查找屬主不是tom也不是bash的文件
eg6:查找數值是bash或者屬主UID號爲4010的文件
eg7:找出/tmp目錄下,屬主不是root,且文件名不是fstab的文件
eg8:排除目錄:find /etc -path ‘/etc/sane.d’ -a -prune -o-name *.conf
根據文件大小來查找:
-size [+|-]#UNIT
常用單位:k, M, G
#UNIT: (#-1, #],如:10k
-#UNIT:[0,#-1], 如:-10k
+#UNIT:(#,∞), 如:+10k
根據時間戳查找:
以“天”爲單位;
-atime [+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#:[0,#)
-mtime;
-ctime;
以“分鐘”爲單位:
-amin;
-mmin;
-cmin;
根據權限查找:
-perm [/|-]MODE
MODE: 精確權限匹配;
/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關係,+ 從centos7開始淘汰;
表示任何一類用戶的權限中包含寫權限就OK;
-MODE:每一類對象都必須同時擁有指定權限,與關係;
0:表示不關注;
find -perm 755 會匹配權限模式恰好是755的文件;
find -perm /222,只要當任意人有寫權限時,就會匹配;
find -perm -222,只有當每個人都有寫權限時,纔會匹配;
find -perm -002,只有當其它人(other)有寫權限時,纔會匹配;
處理動作:
-print:默認的處理動作,顯示至屏幕;
-ls:類似於對查找到的文件執行“ls-l”命令;
-delete:刪除查找到的文件;
-fls file:查找到的所有文件的長格式信息保存至指定文件中;
-ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令;
對於每個文件執行命令之前,都會交互式要求用戶確認
-exec COMMAND {} \; 對查找到的每個文件執行由 COMMAND指定的命令;
{}: 用於引用查找到的文件名稱自身;
find傳遞查找到的文件至後面指定的命令時,查找到所有符合 條件的文件一次性傳遞給後面的命令;
有些命令不能接受過多參數,此時命令執行可能會失敗,下 面方式可規避此問題 find |xargs COMMAND;
示例: find -name “*.conf” -exec cp {} {}.org \; ##備份配置文件,添加.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 {} \; ##查找.sh結尾權限爲644的普通文件,把644文件權限改爲755 find /home –type d -ls ##查找/home目錄下的目錄文件並以長格式顯示;