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