文件查找
文件查找就是在在文件系統上查找符合條件的文件;
文件查找分為:
實時查找:遍歷所有文件進行條件匹配
非實時查找:根據所以查找
locate:
1、查詢系統上預建的文件索引數據庫
/var/lib/mlocate/mlocate.db
2、locate屬于非實時查找,依賴于事先構建的索引;
索引的構建是在系統較為空閑時自動進行(周期性任務);管理員手動更新數據庫(updatedb);
3、索引構建過程需要遍歷整個根文件系統,極消耗資源;
4、工作特點:
查找速度快;
模糊查找;
非實時查找
搜索的是文件的全路徑,不僅僅是文件名
可能只搜索用戶具備讀取和執行權限的目錄
locate用法:
1、格式:
locate KEYWORD
2、有用的選項:
-i執行區分大小寫的搜索
-n X只列舉前X個匹配項目
3、示例
1)搜索名稱或路徑中帶有“foo”的文件
locate foo
2) 使用Regex來搜索以“.foo”結尾的文件
locate -r ‘\.foo$’
find
find屬于實時查找,通過遍歷指定路徑下的文件系統層次結構完成文件查找
1、工作特點:
查找速度略慢
精確查找
實時查找
可能只搜索用戶具備讀取和執行權限的目錄
2、語法:
find [OPTION]… [查找路徑] [查找條件] [處理動作]
查找路徑:指定具體目標路徑;默認為當前目錄
查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認為找出指定路徑下的所有文件
處理動作:對符合條件的文件做操作,默認輸出至屏幕
查找條件
1、根據文件名和inode查找:
-name "文件名稱":支持使用glob
*, ?, [], [^]
-iname"文件名稱":不區分字母大小寫
-inumn 按inode號查找
-samefilename 相同inode號的文件
-links n 鏈接數為n的文件
-regex "PATTERN":以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱
2、根據屬主屬組查找
-user USERNAME:查找屬主為指定用戶(UID)的文件
-group GRPNAME: 查找屬組為指定組(GID)的文件
-uidUserID:查找屬主為指定的UID號的文件
-gidGroupID:查找屬組為指定的GID號的文件
-nouser:查找沒有屬主的文件
-nogroup:查找沒有屬組的文件
3、根據文件類型查找
-type TYPE:
f: 普通文件
d: 目錄文件
l: 符號鏈接文件
s:套接字文件
b: 塊設備文件
c: 字符設備文件
p: 管道文件
4、組合條件
與:-a
或:-o
非:-not, !
德·摩根定律:
非(P 且Q) = (非P) 或(非Q)
非(P 或Q) = (非P) 且(非Q)
或者
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
我們可以理解為(白色代表所求的)
not A的圖
not B的圖
not A or not B = not (A and B)
not A and not B = not (A or B)
示例
查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件
因為-111和-022是并且的關系,所以我們可以把(-111)+(-022)
查找/var目錄下不屬于root和lp的所有文件
5、根據文件大小來查找
-size [+|-]#UNIT
常用單位:k, M, G
#UNIT: (#-1, #],如:6k
-#UNIT:[0,#-1], 如:-6k
+#UNIT:(#,∞), 如:+6k
6、根據時間戳來查找文件
以“天”為單位;
-atime[+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分鐘”為單位:
-amin
-mmin
-cmin
7、根據權限查找
-perm [/|-]MODE
1)MODE: 精確權限匹配
2)/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關系,+ 從centos7開始淘汰
3)-MODE:每一類對象都必須同時擁有指定權限,與關系
4)0 表示不關注
示例:
find -perm 755會匹配權限模式恰好是755的文件
只要當任意人有寫權限時,find -perm +222就會匹配
只有當每個人都有寫權限時,find – perm -222才會匹配
只有當其它人(other)有寫權限時,find -perm -002才會匹配
8、動作處理
-print:默認的處理動作,顯示至屏幕; -ls:類似于對查找到的文件執行“ls -l”命令 -delete:刪除查找到的文件; -fls file:查找到的所有文件的長格式信息保存至指定文件中 -ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令;對于每個文件執行命令之前,都會交互式要求用戶確認 -exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令 {}: 用于引用查找到的文件名稱自身
find傳遞查找到的文件至后面指定的命令時,查找到所有符合條件的文件一次性傳遞給后面的命令
有些命令不能接受過多參數,此時命令執行可能會失敗,下面方式可規避此問題
find | xargsCOMMAND
需要注意的是,在執行或者過程中要只用ls長格式顯示,必須使用(),否者ls只會匹配最近一個條件
示例:
9.find示例
1、find -namesnow.png 搜索名為snow.png的文件
2、find -inamesnow.png 不分大小寫地搜索名為snow.png、Snow.png、SNOW.PNG等等的文件
3、find / -name *.txt 搜索以txt為后綴的所有文件
4、find /var –name *log* 搜索含有log為關鍵字的所有文件
5、find -user joe -groupjoe 搜索被用戶joe 以及組群joe所擁有的文件
6、find -user joe -not -group joe 搜索用戶joe,且該用戶不屬于joe組
7、find -user joe -o -user jane 搜索用戶joe或用戶jane
8、find -not\( -user joe -o -user jane\) 搜索用戶既不是joe并且也不是jance
9、find / -user joe -o -uid500 搜索搜索一個用戶名是joe或uid是500的用戶
10、find /tmp \( -not -user root -a -not -name 'fstab' \) –ls 找出/tmp目錄下,屬主不是root,且文件名不是fstab的文件
11、find /tmp-not \( -user root -o -name 'fstab' \) –ls ?排除目錄
12、find /etc -path ‘/etc/sane.d’ -a -prune -o -name *.conf -print 在/etc目錄下,排除/etc/sane.d目錄,查找帶有conf后綴的文件,并加以顯示
13、find -name “*.conf” -exec cp {} {}.org \ 備份配置文件,添加.orig這個擴展名
14、find /tmp -ctime +3 -user joe -o krm{}\ 提示刪除存在時間超過3天以上的joe的臨時文件
15、find ~-perm-002 -exec chmod o-w {}\ 在你的主目錄中尋找可被其它用戶寫入的文件
16、find /data -type f -perm 644 -name *.sh -exec chmod 755 {} \ 在data目錄下查找權限為644、后綴是.sh的普通文件,將其的權限修改為755
17、find /home -type d -ls 在home的目錄下查找塊設備
小試牛刀
1、查找/var目錄下屬主為root,且屬組為mail的所有文件
2、查找/var目錄下不屬于root、lp、gdm的所有文件
3、查找/var目錄下最近一周內其內容修改過,同時屬主不為root,也不是postfix的文件
4、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件
5、查找/etc目錄下大于1M且類型為普通文件的所有文件
6、查找/etc目錄下所有用戶都沒有寫權限的文件
7、查找/etc/init.d/目錄下至少有一類用戶沒有執行權限的文件
8、查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件
原創文章,作者:xiaoqing,如若轉載,請注明出處:http://www.www58058.com/36335
文章對find命令的常見用法,有了一個完整的梳理。find命令在筆試中幾乎是必考的內容,而其中最難的是-perm選項,故他需要我們對摩根定律有一個深刻的理解,才能熟練掌握,希望下來能多多練習,熟練掌握。