本次博主來介紹下超實用的查找命令,沒有查不到,只有做不到。
直接上干貨:查找命令:locate和find,常用find,我們重點介紹find
locate
通過查詢系統上預建的文件索引數據庫全盤查找所需文件,locate是透過update程序將硬盤中的所有檔案和目錄資料先建立一個索引數據庫,在執行loacte時直接找該索引,查詢速度會較快,索引的構建是在系統較為空閑時自動進行(周期性任務),索引構建過程需要遍歷整個根文件系統,極消耗資源。
索引數據庫:/var/lib/mlocate/mlocate.db
管理員可以手動更新數據庫(命令:updatedb),在內定值中,updatedb每天執行一次,可以修改crontab來更新設定值。(etc/crontab)
工作特點:
查找速度快
模糊查找
非實時查找
搜索的是文件的全路徑,不僅僅是文件名
只搜索用戶具備讀取和執行權限的目錄
接下來簡單介紹幾個常用選項
-i 不區分大小寫的搜索
-n N 只列舉前N 個匹配項目
-c –count 只顯示搜索匹配到的個數
-r –regexp REGEXP搜索基本正則表達式 REGEXP 來代替模式
–regex模式是擴展正則表達式
示例:
[root@localhost ~]#locate -n 10 install #取全盤查詢包含install字符的文件的前10個 [root@localhost ~]#locate -r "install$" #利用基本正則表達式取全盤中以install結尾的文件 [root@localhost ~]#locate -ir "install$" #不區分大小寫利用基本正則表達式取全盤中以install結尾的文件 [root@localhost ~]#locate -icr "[0-9]\{1,\}\/install$" -----#利用基本正則表達式查詢表統計匹配數 注意c加在r前面 [root@localhost ~]#locate -ic --regex "[0-9]{1,}/install$" -----#利用拓展正則表達式查詢表統計匹配數
find
find命令是一個實時查找工具,通過遍歷指定路徑而完成對文件的查找;在使用該命令時,如果不選定參數,則在當前目錄下查找子目錄與文件并顯示;另外,任何位于參數之前的字符串,都將視為欲查找的目錄名。
工作特點:
查找速度略慢
精確查找
實時查找
可能只搜索用戶具備讀取和執行權限的目錄
find語法:
find [OPTION]… [查找路徑] [查找條件] [處理動作]
查找路徑:指定具體目標路徑,默認為當前目錄
查找條件:指定的查找標準,可以是文件名、大小、類型、權限等標準進行;默認為找出指定路徑下的所有文件
處理動作:對符合條件的文件做操作,默認輸出至屏幕
查找條件 :
1. 根據文件名和inode查找
2. 根據屬主、屬組查找
3. 根據文件類型查找
4. 根據邏輯組合條件查找
5. 根據文件大小來查找
6. 根據時間戳來查找
7. 根據權限來查找
根據文件名和inode查找:
-name “文件名稱“: 支持使用glob,*, ?, [], [^]
-iname “文件名稱“: 不區分字母大小寫
-inum n: 按inode號查找
-somefile name: 相同的inode號文件
-links n: 鏈接數為n的文件
-regex 支持正則默認為(emacs標準)
-regextype egrep -regex
支持egrep同標準的正則支持更多表達式,比如:[[:digit:]][[:alpha:]]…….
示例:
[root@localhost ~]#find / -name insta #精確查找,系統中無此文件 [root@localhost ~]#find / -name insta?? /sys/fs/selinux/class/db_procedure/perms/install /sys/fs/selinux/class/x_colormap/perms/install /usr/bin/install #支持通配符查找 [root@localhost app]#ln passwd mima #通過設置硬鏈接,創建兩個不同文件名的相同文件(inode) [root@localhost app]#find -samefile mima #查找相同inode號的文件 ./passwd ./mima [root@localhost app]#find -links 2 #查找鏈接數為2的文件 . ./passwd ./mima [root@localhost app]#
根據屬主屬組查找:
-user USERNAME: 查找屬主為指定用戶(UID)的文件
-group GROUPNAME: 查找屬組為指定組(GID)的文件
-uid UserID: 查找屬主為指定的UID號的文件
-gid GroupID: 查找屬組為指定的GID號的文件
-nouser: 查找沒有屬主的文件
-nogroup: 查找沒有屬組的文件
示例:
[root@localhost etc]#find -user wangcai #查找屬主為wangcai的文件 [root@localhost etc]#find -group wangcai #查找屬組為wangcai的文件 [root@localhost etc]#find -nouser #查找沒有屬主的文件 [root@localhost etc]#find -nogroup #查找沒有屬主的文件
根據文件類型查找:
-type TYPE:
f: regular file普通文件
d: directory 目錄文件
l: symbolic link符號鏈接文件
s:socket 套接字文件
b: block (buffered) special 塊設備文件
c: character (unbuffered) special字符設備文件
p: named pipe (FIFO)管道文件
此處不做示例,格式為:find -type f
根據邏輯組合條件查找:
組合條件:
與:-a
或:-o
非:-not,
!
摩根定律:
(非P) 或(非Q) = 非(P且Q)
(非P) 且 (非Q) = 非(P或Q)
示例:
[root@localhost ~]#find /tmp \( -not -user root -a -not -name 'f*' \) #摩根定律找出/tmp目錄下,屬主不是root,且文件名不以f開頭的文件 [root@localhost ~]#find /tmp -not \( -user root -o -name 'f*' \) #摩根定律找出/tmp目錄下,屬主不是root,且文件名不以f開頭的文件
根據文件大小查找:
-size [+|-]#UNIT
常用單位:k,M,G
#UNIT:
(#-1,#] 如:5M 表示 (4M,5M]
-#UNIT:
[0,#-1] 如:-5M 表示 [0,5M]
+#UNIT:
(#,oo) 如:+5M 表示 (6M,oo)
關于文件大小查找的解釋:為什么-size 5M 不是找精確的5M而是表示(4M,5M], 試想文件的大小指什么?是指文件數據的大小還是包括了元數據后的大小,文件的大小肯定是包含元數據后大小的,而我們一般以文件大小找文件時往往考慮的是文件整個數據的大?。涣硗?,精確查找一定大小的文件意義不大;所以這里的大小會有1個單位的浮動。
示例:
[root@localhost etc]#find -size 3M #查找文件大小在[3,4)M(大于等于3M小于4M)之間的文件 [root@localhost etc]#find -size -3M #查找文件大小在[0,3)M之間的文件 [root@localhost etc]#find -size +3M #查找文件大小在(3,∞)M之間的文件
根據時間戳查找:
以”天”為單位:-atime/-mtime/-ctime通用
-atime [+|-]#
#: [#,#+1)
+#:
[#+1,oo)
-#: [0,#)
同理:以“分鐘”為單位:-amin/-mmin/-cmin通用
關于時間戳查找的解釋:為什么-atime 3 表示的是[3,4),我們這兒所說的時間是指時間段而非時刻,一“天”與一“分鐘”都是指一個時間段,只有[3,4)這個半閉半開的區間才能完整地表示第三天。
根據權限查找:
-perm [/|-]MODE
MODE: 精確匹配權限
/MODE: 任何一類(u,g,o)對象的權限中只要能一位匹配即可,屬于或關系。以前用‘+’,CentOS 7以‘/’替代之
-MODE: 每一類對象都必須同時擁有指定權限,屬于與關系
0:表示不關注
示例:
[root@localhost etc]#find -perm 644 #表示要嚴格查找匹配644的文件 [root@localhost etc]#find -perm +222 #表示u,g,o任何一類用戶有寫權限即查找匹配 [root@localhost etc]#find -perm -222 #表示僅嚴格查找匹配寫權限,即每個用戶必須要有寫權限 [root@localhost etc]#find -perm -002 # 表示僅嚴格查找匹配other用戶的寫權限
處理動作:
1. -print: 默認動作,顯示至屏幕
2. -ls: 類似于對查找到的文件執行 ls -l 命令
3. -delete: 刪除查找到的文件
4. -fls file: 查找到的所有長格式的信息保存至指定文件中
5. -ok COMMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令,且都會交互式要求用戶確認
6. -exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令;
7. {}: 用于引用查找至的文件名稱自身
8. find 傳遞查找到的文件至后面指定的命令時,查找到所有符號條件的文件一次性傳遞給后面的命令
9. 有些命令不能接受過多的參數,此時命令執行可能會失敗,用 xargs 來規避此問題 find |xargs COMMAND
示例:
[root@localhost etc]#find -perm 644 -print #查找到的結果顯示在屏幕上 [root@localhost etc]#find -perm +222-ls #對查找到的結果長列出 [root@localhost etc]#find -perm -222 -delete #對查找到的結果進行刪除 [root@localhost etc]#find -perm -002 -ok cp {} /tmp \; #對查找到的結果進行操作(拷貝結果到其他目錄下)且會交互式要求用戶確認, 注意:-ok 結尾必須是以空格加斜杠再加分號 \; [root@localhost etc]#find -perm -002 -exec cp {} /tmp \; #對查找到的結果進行操作(拷貝結果到其他目錄下)不會交互式要求用戶確認, 注意:-exec 結尾必須是以空格加斜杠再加分號 \;
原創文章,作者:Mozart,如若轉載,請注明出處:http://www.www58058.com/84400