find、locate文件查找命令
find 命令
特征:是一個可以實時查找搜索的工具,通過遍歷指定路徑完成文件查找。
使用特性:
查詢速度相比locate工具較慢
可以更精確的查找
實時的查找
可以按特定且多樣的條件指定搜索
可能只是搜索用戶具備讀取和執行權限的的目錄
用法:
find [option]... /patn/to/file [where] [action]
path:指定查找的具體路徑,不指定默認為當前目錄下
where:指定的查詢條件,可以是文件名、文件大小、文件權限、文件屬組等權限,不指定默認會查找指定目錄下的所有文件以及子目錄下的所有文件
action:對指定好的條件匹配后,后面跟特定的動作,對前面指定的條件的文件列表做一些查找,可以是打印路徑、文件信息列表,默認不指定動作為顯示所有匹配條件的文件路徑
where(查找的常用條件):
根據文件名和inode查找:
-name “文件名關鍵字”:區分字母大小寫
-iname “文件名關鍵字”:不區分字母大小寫
-inum #:按照指定的inode編號進行查找對應編號的指定文件,#為inode編號
-samefile [filename]:通過指定的文件名來查詢與其inode編號相同的文件
-links #:查詢鏈接數為#的文件
-regex“PATTERN”:以PATTERN(正則表達式或關鍵字符)進行匹配整個文件路徑字符串,不僅僅是針對文件名稱,可能還有路徑、屬性等
根據文件的屬主、屬組查找:
-user [username]:查詢屬主為指定用戶(UID)的文件
-group [groupname]:查詢屬組為指定用戶組(GID)的文件
-uid [user_id]:查詢屬主為指定的UID號的文件
-gid [group_id]: 查找屬組為指定的GID號的文件
-nouser:查詢沒有屬組的文件(比如屬組位為空或只顯示UID)
-nogroup:查找沒有屬組的文件
注意:這里的通過用戶名、屬組名,在查詢時實際上是先去找用戶或組的ID號進行查詢,而不是真正通過用戶或組的名稱進程搜索。
[root@mzf ~]# find /home -user u2 /home/u2 /home/u2/.bash_logout /home/u2/.bash_profile /home/u2/.gnome2 /home/u2/.bashrc /home/u2/.mozilla /home/u2/.mozilla/extensions /home/u2/.mozilla/plugins
View Code
根據文件類型查詢:
-type TYPE:
f 普通文件
d 目錄文件
l鏈接文件
s 套接字文件
b 塊設備文件
c 字符設備文件
p 管道文件
查找目錄:find /(查找范圍) -name '查找關鍵字' -type d
條件的組合用法:
與:-a (注意與的優先級要高于或,前后位置不同可能條件也會有所變化)
或:-o
非:-not , !
德摩根定律:
非A或 非B = 非(A并B)
非A且 非B = 非(A或B)
例如:! -user u1 -a ! -user u2 = ! (-user u1 -o -user u2)
! -user u1 -o ! -user u2 = ! (-user u1 -a -user u2)
舉例說明:
單個條件
find -name aa.jpg #搜索文件名為aa.jpg 的文件 find -iname aa.jpg #不區分大小寫同時搜索aa.jpg AA.jpg AA.JPG等文件 find / -name “*test*” #搜索當前系統下文件名中包含test字符的文件 find /var -name “*.sh” #搜索/var的后綴為.sh腳步文件 find -user u1 -group u1 #搜索文件屬主和屬組名稱相同的文件
多個條件
find -user u1 -not -group u1 #查詢屬主為u1但屬組不為u1的文件 find -user u1 -o -user u2 #查詢屬主為u1或者u2的文件 find -not ( -user u1 -o -user u2 ) #查詢用戶屬組非u1和u2的文件 find -not -user u1 -a -not -user u2 #等價于上面帶括號的寫法 find / -user u1 -o -uid 500 #屬組名稱為u1或者uid為500的文件
#查詢/tmp目錄下,屬主不是root,且文件名不以f開頭的文件
方法一:
find /tmp ( -not -user root -a -not -name "f*" ) -ls
解析:因為后面的-ls動作默認會取最后一個條件作為顯示結果,所有這里使用括號進行包裹,注意,這里的()需要用轉義,然后括號里內開頭和結尾都要空格隔開
方法二:
find /tmp -not ( -user root -o -name "f*" ) -ls
安裝文件大小進行查找:
-szie [+|-][unit]unit表示單位,常用有:k,M,G
如:3k 表示2K+到3K,其中不包括2K整
如:-3k 表示0k到3K以內
如:+3K 表示3K以及以上
根據文件時間屬性查詢:
-atime [+|-]#,訪問時間
#:表示#天以及#+1天
+#:#天、#天以上
-#:0天到#天
-amin 查找在系統中最后#分鐘訪問的文件(access time)
-mtime查找在系統中最后#天里修改過的文件(modify time)
-mmin 查找在系統中最后#分鐘里修改過的文件(modify time)
-ctime查找在系統中最后#天里修改過屬性的文件
-cmin 查找在系統中最后#分鐘里修改過屬性的文件
根據文件權限位數值查詢:
-perm [/|-] MODE
MODE:精確匹配每個權限位都必須符合
/MODE:只要(u,g,o)有一類權限位包含有指定權限就匹配
-MODE:(u,g,o)其中必須每一位都包含對應位的權限
舉例:
find -perm 755 #對應權限位必須為755全滿足 find -perm /222 #3個權限位任意人權限位有寫權限就滿足 find -perm -222 #3個權限位中都必須都包含有寫權限就滿足 find -perm -002 #3個權限位只有其它用戶必須包含寫權限
ACTION(動作處理):
-print:默認顯示文件集合路徑
-ls:對于匹配的文件進行類似ls -l的長模式格式顯示
-delete:刪除查找到的文件
-fls file:查找到的所有文件的長格式信息保存的指定文件中,類似重定向輸出
-ok COMMAND {} ;對查找到的每個文件執行指定的命令操作,每個文件被執行命令之前都會進行交互式判斷
-exec COMMAND {} ;對查找到的每個文件執行COMMAND指定的命令,每個文件被執行命令之前無需進行交互式判斷
{} :表示查詢到的每個文件自身路徑引用,find傳遞的文件到指定命令時,查詢的所有文件成一個集合保存為{}。
注意:COMMAND參數如果指定過多,可能會不支持,這時需要借助xargs命令,例如:
find ./ -user u1 | xargs chmod -o-x {} ;
注意:最后引用完一定要加上;,否則會報錯
#查詢/etc 下所有后綴名為.conf的配置文件并拷貝到/backup目錄下且后綴為.bak
find /etc -name “*.conf” exec cp {} /backup/{}.bak ;
#提示/tmp 下屬主為u1用戶且訪問時間超過3天的文件,并刪除
find /etc -user u1 -atime +3 -ok rm {} ;
#查詢當前用戶家目錄下可被其它用戶寫入的文件,并去掉其它用戶的執行權限
find ~ -perm /002 -exec chmod o-x {} ;
#查詢/test 下權限為664且后綴為.sh普通文件,修改權限位為755
find /test -perm 664 -name “*.sh” -exec chmod 755 {} ;
#列出/home下所有的目錄
find /home -type d -ls
locate 命令:
原理:此命令查詢文件的準確度依賴于系統上預建的文件索引數據庫文件:
/var/lib/mlocate/mlocate.db
索引的構建:
索引的構建是在系統較為空閑時自動進行的周期性任務,當然系統管理員也可以手動更新和刪除數據庫(一般使用updatedb命令)。
索引的構建過程需要遍歷整個根文件系統,因此相當消耗系統資源。
locate命令查找特點:
查找速度快(在mlocate.db數據庫中查找)
模糊查找(正則查找)
非實時查找(數據庫周期性更新)
且搜索的是對文件的全路徑,不僅僅是針對文件名(不能指定文件名索引,只能通過正則指定文件名進行索引)
可能只是針對搜索用戶具備讀取和執行權限的目錄
locate命令用法:
locate [option] keyword
option:
-i :執行時區分關鍵字大小寫
-n # :只列舉最前#個匹配項的匹配文件
-r reg :通過匹配正則表達式來匹配
例如:
通過關鍵字進行模糊查找
[root@mzf ~]# locate foo | wc -l #查找當前系統下多少個含有foo關鍵字的文件 6223 [root@mzf ~]# locate foo | head -n 5 #因為上面統計搜索出6223行,這里只顯示5行 /etc/foomatic /etc/foomatic/defaultspooler /etc/foomatic/filter.conf /usr/bin/foomatic-combo-xml /usr/bin/foomatic-compiledb
View Code
解析:查找速度特別快,但是并非實時搜索,可能對于某些剛剛建立的文件搜素不到。這時可以使用updatedb命令或者刪除索引文件,再使用updatedb命令重新遍歷創建
通過正則表達式模式匹配查找
[root@mzf ~]# locate -r ".sh$" #通過正則表達式來查詢所有腳步文件 /etc/X11/xinit/xinitrc.d/00-start-message-bus.sh /etc/X11/xinit/xinitrc.d/50-xinput.sh /etc/X11/xinit/xinitrc.d/localuser.sh
通過正則表達式來匹配對應路徑
[root@mzf ~]# locate -r "^/root/ch.*.sh" #雖然沒有指定路徑的條件,但是正則卻能完成 /root/checkdisk.sh /root/checkint.sh
解析:從上一個例子可以看出,查找出來的都是一行一行的文件全路徑,那么把全路徑當作一個字符串進行精確匹配同樣也可以達到效果,當然也可能查找不到,這時就需要下面的更新或重建文件索引數據庫了:
通過updatedb命令來更新或者創建最新的索引文件以確保locate查詢的準確性:
解析:一般情況下不會去手動更新或者構建數據庫,當然locate命令在實際中也并不是用來查詢所有文件的,但是因為有索引庫的存在,所以可以用來查詢常見的系統及服務的配置文件,因為這類文件的位置一般不會改變。再加上locate依賴于庫文件,所以查找這些配置信息文件速度相對會很快,但是對于日志文件時常變化就不太好適用了。
總結
以上是生活随笔為你收集整理的find、locate文件查找命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动点击器怎么设置滑动
- 下一篇: 京喜app一分钱购买是真的吗