檔案查找
在檔案系統上查找符合條件的檔案;
檔案查找: locate, find
非實時查找(資料庫查找): locate
實時查找: find
1. 非實時查找(資料庫查找): locate
查詢系統上預建的檔案索引資料庫 (基于此資料庫搜尋)
資料庫: /var/lib/mlocate/mlocate.db
依賴于事先建構的索引
索引的建構是在系統較為空閑時自動進行(周期性任務),
管理者手動更新資料庫 : updatedb
(建立立的檔案,需要更新資料庫以後才能搜尋到,是以适合查找比較穩的,
不變的系統内部配置檔案)
索引建構過程需要周遊整個根檔案系統,極消耗資源
工作特點:
查找速度快
模糊查找
非實時查找
搜尋的是檔案的全路徑,不僅僅是檔案名
可能隻搜尋使用者具備讀取和執行權限的目錄
locate指令
locate KEYWORD
常用的選項
-i 執行區分大小寫的搜尋
-n N 隻列舉前N個比對項目
-r 使用正規表達式搜尋
eg:
locate foo
搜尋名稱或路徑中帶有“ foo”的檔案
locate -r ‘\.foo$’
使用Regex來搜尋以“ .foo”結尾的檔案
2.實時檔案查找工具: find
find
實時查找工具,通過周遊指定路徑完成檔案查找;
工作特點:
查找速度略慢
精确查找
實時查找
可能隻搜尋使用者具備讀取和執行權限的目錄
目錄搜尋時,自動遞歸搜尋
文法:
find [OPTION]… [查找路徑] [查找條件] [處理動作]
查找路徑:指定具體目标路徑;預設為目前目錄
查找條件:指定的查找标準,可以檔案名、大小、類型、
權限等标準進行;預設為找出指定路徑下的所有檔案
處理動作:對符合條件的檔案做操作,預設輸出至螢幕
(注意文法中的格式,應使用正規表達式一緻的文法格式)
查找條件
根據檔案名和inode查找:
-name "檔案名稱"(精确搜尋):支援使用glob
*, ?, [], [^] 支援通配 –> 注意需要加雙引号
-iname "檔案名稱": 不區分字母大小寫
-inum n 按inode号查找
-samefile name 相同inode号的檔案
-links n 連結數為n的檔案
-regex "PATTERN":以PATTERN比對整個檔案路徑字
符串,而不僅僅是檔案名稱
根據屬主、屬組查找:
-user USERNAME: 查找屬主為指定使用者(UID)的檔案
(注意: 系統是按UID來搜尋的)
-group GRPNAME: 查找屬組為指定組(GID)的檔案
-uid UserID: 查找屬主為指定的UID号的檔案
-gid GroupID: 查 找屬組為指定的GID号的檔案
-nouser: 查找沒有屬主的檔案
-nogroup: 查找沒有屬組的檔案
(多個條件可以直接聯用, 代表與關系,即 -a, -a 可省略 )
eg find / -nouser -nogroup )
根據檔案類型查找:
-type TYPE:
f: 普通檔案
d: 目錄檔案
l: 符号連結檔案
s:套接字檔案
b: 塊裝置檔案
c: 字元裝置檔案
p: 管道檔案
組合條件:
與: -a
或: -o
非: -not, !
find / -name "abc.sh" -a -name "bsd"
find -not -name "adb"
德·摩根定律:
(非 P) 或 (非 Q) = 非(P 且 Q)
(非 P) 且 (非 Q) = 非(P 或 Q)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
12
find 示例
find -name snow.png
搜尋名為snow.png的檔案
find -iname snow.png
不分大小寫地搜尋名為snow.png、Snow.png、
SNOW.PNG等等的檔案
find / -name “*.txt”
find /var –name “*log*”
find -user joe -group joe
搜尋被使用者joe 以及組群joe所擁有的檔案
find -user joe -not -group joe
find -user joe -o -user jane
find -not \( -user joe -o -user jane \)
find / -user joe -o -uid 500
找出/tmp目錄下,屬主不是root,且檔案名不以f開頭的檔案
find /tmp \( -not -user root -a -not -name 'f*' \) -ls
find /tmp -not \( -user root -o -name 'f*' \) –ls
排除目錄 -prune (不搜尋該目錄)
示例:查找/etc/下,除/etc/sane.d目錄的其它所有.conf字尾的檔案
find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf” -print
(忽略/root/bin 目錄, 不對其搜尋,)
根據檔案大小來查找:
-size [+|-]#UNIT (非精确大小)
常用機關: k, M, G
#UNIT: (#-1, #]
如: 6k 表示(5k,6k]
-#UNIT: [0,#-1]
如: -6k 表示[0,5k]
+#UNIT: (#,∞)
如: +6k 表示(6k,∞)
根據時間戳:
以“天”為機關;
-atime [+|-]#,
#: [#,#+1) [7,8)
+#: [#+1,∞] [0,7)
-#: [0,#) [8,+無窮)
-mtime
-ctime
以“分鐘”為機關:
-amin
-mmin
-cmin
根據權限查找:
-perm [/|-]MODE
MODE: 精确權限比對
/MODE:任何一類(u,g,o)對象的權限中隻要能一位 即可,或關系, + 從centos7開始
淘汰
-MODE:每一類對象都必須同時擁有指定權限,與關系
0 表示此位置上的權限不關注
find -perm 755 會比對權限模式恰好是755的檔案(精确比對)
隻要當任意人有寫權限時, find -perm +222就會比對
隻有當每個人都有寫權限時, find -perm -222才會比對
隻有當其它人( other)有寫權限時, find -perm -002才會比對
( + : 或者關系
– : 并且關系 )
find -perm -020 –> 隻有group 上有寫權限的檔案符合處理動作
-print:預設的處理動作,顯示至螢幕; (預設即有輸出)
-ls:類似于對查找到的檔案執行“ ls -l”指令
注意前面指令是否需要括起來
-delete:删除查找到的檔案;
-fls file:查找到的所有檔案的長格式資訊儲存至指定檔案中
-ok COMMAND {} \; 對查找到的每個檔案執行由
COMMAND指定的指令; ( {} 代表搜尋出的檔案 )
對于每個檔案執行指令之前,都會互動式要求使用者确認
-exec COMMAND {} \; 對查找到的每個檔案執行由 (有風險)
COMMAND指定的指令
{}: 用于引用查找到的檔案名稱自身
find傳遞查找到的檔案至後面指定的指令時,查找到所有符合
條件的檔案一次性傳遞給後面的指令
有些指令不能接受過多參數,此時指令執行可能會失敗,下
面方式可規避此問題
find | xargs COMMAND
處理動作
xargs -0(零) 換行
find示例
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 {} \;
find /home –type d -ls
練習
1、查找/var目錄下屬主為root,且屬組為mail的所有檔案
find /var -user root -group mail
2、查找/var目錄下不屬于root、 lp、 gdm的所有檔案
find /var -not \(-user root -o -user lp -o -user gdm \)
3、查找/var目錄下最近一周内其内容修改過,同時屬主不為root,也不是postfix的檔案
find /var -not \( -user root -o -user postfix \) -mtime -7
4、查找目前系統上沒有屬主或屬組,且最近一個周内曾被通路過的檔案
find \( -nouser -o -group \) -atime -7
5、查找/etc目錄下大于1M且類型為普通檔案的所有檔案
find /etc -size +1M -type f
6、查找/etc目錄下所有使用者都沒有寫權限的檔案
find /etc -not -perm /222
8、查找/etc/init.d目錄下,所有使用者都有執行權限,且其它
使用者有寫權限的檔案
find /etc/init.d -perm -113