locate
查詢系統上預建的文件索引數據庫
/var/lib/mlocate/mlocate.db
依賴于事先構建的索引
索引的構建是在系統較為空閑時自動進行(周期性任務),管理員手動更新數據庫(updatedb)
索引構建過程需要遍歷整個根文件系統,極消耗資源
工作特點:
?查找速度快
?模糊查找
?非實時查找
?搜索的是文件的全路徑,不僅僅是文件名
?可能只搜索用戶具備讀取和執行權限的目錄
當用戶對這個目錄有查看權限時,會直接在數據庫中尋找,當用戶對這個目錄沒有查看權限時,不顯示。
-i 不區分大小寫的搜索
-n X 只列舉前X個匹配項目
updatedb 更新locate數據庫 /var/lib/mlocate/mlocate.db
-r 支持正則
find
實時查找工具,通過遍歷指定路徑完成文件查找
工作特點:
?查找速度略慢
?精確查找
?實時查找
?可能只搜索用戶具備讀取和執行權限的目錄
語法:
find [OPTION]… [查找路徑] [查找條件] [處理動作]
查找路徑:指定具體目標路徑;默認為當前目錄
查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認為找出指定路徑下的所有文件
處理動作:對符合條件的文件做操作,默認輸出至屏幕
例如:find -user joe -not -group joe在當前目錄下查找屬主是joe,屬組不是joe的文件
find / -name “*.txt” 查找根目錄下文件名以.txt結尾的文件
指搜索層級
-maxdepth level 最大搜索深度
-minxdepth level 最小搜索深度
根據文件名和inode查找:
-name 基于名稱的精確查找
-iname 基于名稱忽略大小寫的精確查找查找
-inum 基于inode查找
-samefile 基于相同inode號的查找(查找硬鏈接)
-links n 硬鏈接為n的文件
-regex 支持正則 默認為(emacs標準)
-regextype egrep -regex 支持egrep 同標準的正則
find -regex不支持[[:upper:]],[[:alpha:]],[[:alnum:]],[[:lower:]]等,用find -regextype egrep -regex支持
根據屬主、屬組查找:
-user 用戶名 基于文件owner的查找
-group 組名 基于文件group的查找
-uid userid 基于文件uid的查找
-gid groupid 基于文件gid的查找
-nouser 查找沒有owner的文件
-nogroup 查找沒有group的文件
-type 基于文件類型的查找
? f: 普通文件
? d: 目錄文件
? l: 符號鏈接文件
? s:套接字文件
? b: 塊設備文件
? c: 字符設備文件
? p: 管道文件
組合條件:
與:-a
或:-o
非:-not, !
德·摩根定律:
(非A) 或(非B) = 非(A 且B)
(非A) 且(非B) = 非(A 或B)
示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
示例:查找/etc/下,除/etc/sane.d目錄的其它所有.conf后綴的文件
find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf”
find /etc \( -path ‘/etc/sane.d’ -o -path ‘/etc/fonts’ \) -a -prune -o -name “*.conf”
-size [+|-]#UNIT 根據文件大小來查找
常用單位:k, M, G,c(byte)
#UNIT: (#-1, #]如:6k 表示(5k,6k] find -size 6k
-#UNIT:[0,#-1]如:-6k 表示[0,5k] find -size -6k
+#UNIT:(#,∞)如:+6k 表示(6k,∞) find -size +6k
根據時間戳:
以“天”為單位;
-atime [+|-]#,
#: [#,#+1) find /etc -atime 2 [2,3)大于等于2天小于3天
+#: [#+1,∞] find /etc -atime +2 [3, ∞) 3天以上
-#: [0,#) find /etc -atime -2 [0,2) 2天以內
-mtime
-ctime
以“分鐘”為單位:
-amin
-mmin
-cmin
-perm
mode:精確權限匹配
find -perm 001 查詢user上什么權限都沒有group什么權限都沒有其他人權限為x的文件。
+mode[/mode] 任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關系,+ 從centos7開始淘汰
find – perm /100 表示只查詢user有x權限的文件,其他位不關注。
find -perm /020 表示只查詢group上有w權限的文件,其他位不關注。
find -perm /144 表示查詢user上有x權限或group上有r權限或其他人上有r權限的文件
-mode 每一類對象都必須同時擁有指定權限,與關系0 表示不關注
find -perm -222 查詢user上有w權限且group上有w權限且其他人上有w權限的文件
find -perm -421 查詢user上有r權限且group上有w權限且其他人上有x權限的文件
find -perm -220 查詢user上有w權限且group上有w權限的文件,其他位上的權限不關注。
-print 默認
-delete 直接刪除所查找到的文件,不詢問。
-ls 長列出所查找到的文件
-fls file 將查找到的文件長列出導入到指定文件。
> file
-ok command \; 對查找到的文件當做下一命令的參數去執行(交互式)
-exec command \; 對查找到的文件當做下一命令的參數去執行(非交互式)({}大括號代表查找的結果)
參數替換xargs
因很多命令不支持管道|來傳遞參數,而日常工作中有這個必要,所以就有了xargs命令
xargs用于產生某個命令的參數,xargs可以讀入stdin的數據,并且以空格符或回車符將stdin的數據分隔成為arguments
注意:文件名或者是其他意義的名詞內含有空格符的情況
有些命令不能接受過多參數,命令執行可能會失敗,xargs可以解決
示例:
ls f* |xargs rm
find /sbin-perm +700 |ls -l 這個命令是錯誤的
find /sbin-perm +7000 | xargsls –l
find和xargs格式:find | xargs COMMAND
在d2里面創建45萬個文件,直接用rm -rf *刪不掉,可以通過管道使用xargs傳遞參數來實現,ls或find | xargs rm -rf
find示例:
find -name “*.conf” -exec cp {} {}.orig \;在當前目錄下查找以.conf結尾的文件并復制他到當前目錄下起名為*.conf.orig
find /tmp -ctime +3 -user joe -ok rm {} \;在/tmp下查找元數據時間大于等于3天,user是joe的文件后并刪除
find ~ -perm -002 -exec chmod o-w {} \;在家目錄下查找其他人權限有w的文件后將其其他人上的權限w減去
find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \;在/data下查找權限為644,名字以.sh結尾的普通文件后將其權限改成755
find /home –type d -ls 查找家目錄下的目錄文件并長列出
練習:
1、查找/var目錄下屬主為root,且屬組為mail的所有文件
find /var -user root -a -group mail -ls
2、查找/var目錄下不屬于root、lp、gdm的所有文件
find /var -not \( -user root -o -user lp -o -user gdm \) -ls
3、查找/var目錄下最近一周內其內容修改過,同時屬主不為root,也不是postfix的文件
find /var/ -mtime -7 -not -user root -not -user postfix -ls
4、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件
find / -nouser -o -nogroup -a -atime -7 -ls
5、查找/etc目錄下大于1M且類型為普通文件的所有文件
find /etc/ -size +1M -a -type f -ls
6、查找/etc目錄下所有用戶都沒有寫權限的文件
find /etc ! -perm /222 -ls
7、查找/etc目錄下至少有一類用戶沒有執行權限的文件
find /etc ! -perm -111 -ls
8、查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件
find /etc/init.d/ -perm -113 -ls
原創文章,作者:fuming,如若轉載,請注明出處:http://www.www58058.com/84415