[toc]
Linux文件查找利器 locate & find
前言
Linux的哲學思想就是一切皆文件,整個Linux系統就是由一個個的文件組成。所以對於Linux用戶來說,與文件打交道是必不可少的工作。小到普通文件,大到配置文件、設備文件,可謂是一切皆文件。面對這些不計其數的文件,如何高效的查找文件,也是熟練使用Linux必不可少的技能了。
面對Linux裏面這些海量的文件,怎樣才能進行有效的快速的查找呢?這就要用到接下來要講的locate和find命令了。locate和find是兩個功能非常強大的查找命令,特別是find命令選項衆多,使用選項時的靈活配合,可以幫助你快速找到想要的文件。
locate和find命令簡介
locate命令是一個基於數據庫的快速文件搜索工具,其工作原理是在系統裏創建一個包含了系統內所有文件名以及路徑的文件索引數據庫,搜索依賴於事先構建的索引數據庫進行。由於是基於數據庫(/var/lib/mlocate/mlocate.db)的搜索,所以locate命令的查找不具有實時性。locate所找的文件若是最近才創建或剛更名的,可能會找不到。
系統內的文件是時常改變的,數據庫也不能一成不變,否則就很難達到文件查找的作用,所以索引數據庫在創建好之後一般都會被放入到自動計劃裏,定時自動更新。此外,管理員也可以通過updatedb命令進行實時的更新,但會相當耗費系統資源,所以不要在訪問高峯時段更新數據庫。
由於locate命令進行文件的查找時,是去文件索引數據庫裏查找,而非深入系統中的去查找,所以比find命令整個硬盤搜尋文件速度要快。locate命令具有以下工作特性。
locate命令工作特性:
- 查找速度快
- 模糊查找
- 非實時查找
- 搜索的是文件的全路徑,不僅僅是文件名
- 可能只搜索用戶具備讀取和執行權限的目錄
find命令是一個實時查找工具,通過不同查找路徑、查找條件、處理動作的組合,可以完成非常複雜的查找任務,功能非常多樣且實用。而且,find命令還支持通配符和正則表達式的使用,使搜索變的更加靈活。由於是實時遍歷查找,find有如下特性。
find命令工作特點:
- 列表內容
- 查找速度略慢
- 精確查找
- 實時查找
- 可能只搜索用戶具備讀取和執行權限的目錄
locate命令用法
locate [OPTION]... PATTERN...
常用選項:
-i 不區分大小寫
-n N 只列舉前N個匹配項目
-r 使用擴展的正則表達式來匹配搜索
示例:
locate passwd
查找文件名包含passwd的文件
locate conf
搜索名稱或路徑中帶有“conf”的文件
locate -r '\.conf$'
使用Regex來搜索以“.conf”結尾的文件
find命令用法
find [OPTION]... [查找路徑] [查找條件] [處理動作]
查找路徑:指定具體目標路徑;默認爲當前目錄。
查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認找出指定路徑下的所有文件。
處理動作:對符合條件的文件做操作,默認輸出至屏幕。
使用時如果不選定參數,則在當前目錄下查找子目錄與文件並顯示;且任何位於參數之前的字符串,都將視爲欲查找的目錄名。
查找條件:
搜索層級
-maxdepth level 最大搜索目錄深度,指定目錄爲第一等級
-mindepth level 最小搜索目錄深度
文件名和iNode
-name "文件名稱" 搜索指定名稱的文件,支持使用glob
-iname "文件名稱" 搜索時不區分字母大小寫
-inum n 按iNode號查找
-samefile name 查找相同iNode號的文件
-links n 查找鏈接數爲n的文件
-regex "PATTERN" 以正則表達式匹配整個文件路徑字符串,而不僅僅是文件名稱
屬組和屬主
-user username 查找屬主爲指定用戶的文件
-group groupname 查找屬組爲指定組的文件
-uid userid 查找屬主爲指定UID的文件
-gid gourpid 查找屬組爲指定GID的文件
-nouser 查找沒有屬主的文件
-nogroup 查找沒有屬組的文件
示例:
find / -nouser
搜尋系統中不屬於任何人的檔案,透過這個指令,可以輕易的就找出那些不太正常的檔案。
文件類型
-type f 普通文件
-type d 目錄文件
-type l 符號鏈接文件
-type s 套接字文件
-type b 塊設備文件
-type c 字符設備文件
-type p 管道文件
示例:
find /dev -type b
查找/dev目錄下的塊設備
文件大小
-size [+|-] #unit
常用單位:k 、M 、G 、c (byte)
#UNIT: (#-1, #]
如:6k 表示(5k,6k]
-#UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)
示例:
find / -size +1000k
找出系統中,大於 1MB 的檔案
時間戳
以“天”爲單位;
-atime[+|-]#
#: [#,#+1)
#爲數字,意義爲在#天之前的一天之內被access過的文件
+#: [#+1,∞]
在#加一天後被access過的文件
-#: [0,#)
在#天之前被access過的文件
-mtime 被 modification 過的檔案
-ctime 被 change 過狀態的檔案
以“分鐘”爲單位:
-amin
-mmin
-cmin
-newer file :
file爲一個存在的文件,只要文件比file還要新,就會被列出來。 用在分辨兩個檔案之間的新舊關係是很有用的!
示例:
find / -atime 0
0 代表當前的時間,從現在開始到24小時前被訪問過的文件
find / -mtime 3 ,
列出今天之前的 3*24 ~ 4*24 小時之間有變動過的文件
find /etc -newer /etc/passwd
查找 /etc 底下的檔案,如果檔案日期比 /etc/passwd 新就列出
權限
-perm [/|-]MODE
MODE: 精確權限匹配
/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關係,
-MODE:每一類對象都必須同時擁有指定權限,與關係
對於/MODE和-MODE,0權限表示不關注
示例:
find -perm 755
只會匹配權限模式恰好是755的文件
find -perm /222
只要任何人有寫權限,就會匹配
find -perm -222
只有當每個人都有寫權限時,纔會匹配
find -perm -002
只有當其它人(other)有寫權限時,纔會匹配
組合條件
與:-a
或:-o
非: -not ,!
德·摩根定律:
(非A) 或(非B) = 非(A 且B)
(非A) 且(非B) = 非(A 或B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
排除:-prune
路徑:-path
示例1:
find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf”
在/etc目錄下查找除/etc/sane.d 目錄之外的以.conf結尾的文件
示例2:
find /etc \( -path '/etc/sane.d' -o -path '/etc/fonts' \) -a prune -o -name "*.conf"
查找/etc目錄下除/etc/sane.d和/etc/fonts目錄外的以.conf結尾的文件
處理動作:
-print
顯示至屏幕,默認的處理動作
-ls
類似於對查找到的文件執行“ls -l”命令 默認只顯示最後一項查找的長格式,如果要都顯示需要加\( \),括號內條件要和括號間有空格。
-delete
刪除查找到的文件
-fls file
把查找到的所有文件以長格式信息保存至指定文件中
-ok COMMAND {} \;
對查找到的每個文件執行指定的命令,對於每個文件執行命令之前,都會交互式要求用戶確認
-exec COMMAND {} \;
對查找到的每個文件執行由COMMAND指定的命令,沒有交互式確認,慎重使用。
{}
用於引用查找到的文件名稱自身,相當於一個變量。
\;
表示結束,前面要有空格,否則會有語法錯誤
示例:
find -name “*.conf” -exec cp {} {}.orig \;
備份配置文件,添加.orig這個擴展名
find /tmp -ctime +3 -user joe -ok rm {} \;
查找刪除存在時間超過3天以上的joe的臨時文件
find ~ -perm -002 -exec chmodo -w {} \;
在你的主目錄中尋找可被其它用戶寫入的文件,找到後取消寫權限
find / -perm +7000 -exec ls -l {} \;
將找到的文件使用 ls -l 列出來
補充:參數替換命令xargs
由於很多命令不支持管道 "|"來傳遞參數,而日常工作中有這個必要,所以就有了xargs命令。xargs用於產生某個命令的參數,xargs可以讀入標準輸入的數據,並且以空格符或回車符將標準輸入的數據分隔成爲參數。
find傳遞查找到的文件至後面指定的命令時,查找到所有符合條件的文件一次性傳遞給後面的命令,有些命令不能接受過多參數,命令執行可能會失敗,這個問題xargs可以解決。
注意:文件名或者是其他意義的名詞內含有空格符的情況
find和xargs格式:find | xargs COMMAND示例: ls f* | xargs rm 列出以f開頭的文件傳遞給rm刪除 查找/sbin下屬主擁有讀寫執行任何一項權限的文件以長格式列出 find /sbin -perm +700 | ls -l 這個命令是錯誤的,不會成功執行。 find /sbin -perm +700 | xargsls –l 正確寫法
總結
如果你要查找一個文件的話,使用 find 會是一個不錯的主意! find具有衆多的參數指令,而且還支持正則表達式和通配符,使用靈活。根據文件的屬性使用find命令進行查找也非常實用,配合處理命令可以完成許多複雜的工作,尤其是在查找特殊的文件,以及特殊的文件權限 (SUID/SGID等等) 時, 是相當有用的工具之一!不過缺點也是很明顯的,速度上和locate就沒法比了。locate是一個快速搜索工具,缺點是在功能上比find遜色一些,但在進行一些不算複雜的搜索時,還是locate快速有效。
希望看過之後對你有所幫助,祝你用好locate & find,提高工作效率。