查找命令find的用法
find用法
在linux中一切皆文件,裏面有大量的文件,我們需要在成千上萬個文件找到那些我們需要的文件!!!!這時就需要用到查找命令了,find命令比locate命令的功能要齊全而且要好用的多,所以博主只在這裏接受find命令的用法。
find 格式:find [option]...[查找路徑][查找條件][處理動作]
查找路徑:默認為當前目錄,自動向下遞歸
查找條件:可以是基於文件名,大小,類型,權限等標準進行
處理動作:對查找到的內容做處理,默認輸出打印到屏幕
find是通過遍歷指定路徑完成文件查找,它是精確查找,實時查找,僅搜索用戶具 備rx權限的目錄
(一)查找條件:
一、、基於搜索層級:
1、-maxdepth level最大搜索深度
比如find -maxdepth 1,就表示只搜索1級,即只搜索該目錄下的文件,而不再搜索其下的目錄中的文件
2、-minxdepth level 最小搜索深度
比如find -mindepth 2 ,就表示至少要搜索二級。(搜索路徑默認當前開始,下文就不再一一說了)
wc -l 統計搜索到的內容有多少行
由上圖各個層級搜索可以看出,find的最小層級搜索,只會搜索匹配該等級的文件,比如層級為4時,則只搜索目錄深度有四級以上的,而不搜索目錄不足四級的!
二、基於文件名和inode以及鏈接數的查找:
1、-name “文件名” 基於名稱的精確查找,支持通配符*,?,[],[^],不加“”就不支持通配符了喲~
比如查找當前目錄下文件名為group的文件:
find -name group
例如查找/etc下以.d結尾的文件,(加雙引號表示模糊匹配,與通配符配合使用):
find /etc/ -name “*.d”
2、-iname 基於名稱忽略大小寫的精確查找查找
與-name用法一樣,只是加上i就不區分文件名字大小寫了,也就是不管大小寫都會被搜索
3、-inum n 基於inode查找
例如查找/etc/ 下inode號為81的文件:
find -inum 81
4、-samefile name 基於相同inode號的查找(即查找硬鏈接)
上例find -samefile rpm表示查找與rpm相同inode號的文件,使用ls -i可以查看兩個文件的inode號,顯而易見是一樣的
5、-links n 硬鏈接數為n的文件
比如find -links 6就表示查找連接數為6的文件,此用法容易理解,就不再演示。
6、-regex 支持正則 默認為(emacs標準,即-regextype emacs -regex),默認標準中不能用“[[:upper:]]”,只能用“[A-Z]”
-regextype egrep -regex 支持egrep同標準的正則
比如:find -regextype egrep -regex ".*\/[[:upper:]].*"表示查找當前目錄下所有以大寫字母開頭的文件,這裏的.*相當於通配符的*(關於正則表達式及擴展正則表達式的用法,請參照博主之前的博客)。
三、基於文件的屬主屬組:
1、-user 用戶名 基於文件owner的查找
比如find -user tss表示查找屬主是tss的文件
2、-group 組名 基於文件group的查找
比如find -group root 表示查找屬組是root的文件,與-user用法一樣,就不再示例
3、-uid userid 基於文件uid的查找
比如find -uid 1000 表示查找用戶uid是1000的文件
(可以使用id username 來查看用戶的id號)
4、-gid groupid 基於文件gid的查找
與-uid用法一樣,比如find -gid 1000 表示查找用戶gid是1000的文件
5、-nouser 查找沒有owner的文件
比如find -nouser 表示查找當前目錄下沒有屬主的文件,用法簡單,不再示例
6、-nogroup 查找沒有group的文件
比如find -nogroup 表示查找當前目錄下沒有屬組的文件,用法簡單,不再示例
四、基於文件類型的查找:find -type type
f: 普通文件
d: 目錄文件
l: 符號鏈接文件
s:套接字文件
b: 塊設備文件
c: 字符設備文件
p: 管道文件
以上用法都一樣,所以只舉一個例子來說明一下。
比如查找當前目錄下的目錄文件:
find -type d
五、組合條件:
與:-a,兩個之間不加-a也默認為-a
或:-o
非:-not 或者[!]
比如查找/var目錄下屬主為root,且屬組為mail的所有文件
find /var -user root -a -group mail -ls (-ls表示對查找到的文件進行ls查看處理)
比如查找/etc下屬主不是root的文件
find /etc not -user root
德·摩根定律:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
在find中使用小括號時,小括號裏面兩邊都要有空格,而且需對小括號使用\轉義!
比如查找/var目錄下不屬於root、也不屬於gdm的文件
find /var -not \( -user root -o -user gdm \) -ls 或者
find /var -not -user root -a -user gdm -ls
-prune :排除目錄
示例:查找/etc下除/etc/sane.d目錄之外,所有以.conf結尾的文件
find /etc -path ‘/etc/sane.d‘ -a -prune -o -name "*.conf"
查找/etc下除/etc/sane.d目錄和/etc/fonts之外,所有以.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]
-#UNIT:[0,#-1]如:-6k 表示[0,5k]
+#UNIT:(#,∞)如:+6k 表示(6k,∞)
比如查找/etc下大於3M的文件
七、根據時間戳:
以“天”為單位:
-atime [+|-]#, atime表示訪問時間
-mtime[+|-]#, mtime表示數據修改時間
-ctime[+|-]#, ctime表示元數據修改時間
#: [#,#+1)如3 表示[3,4]
+#: [#+1,∞]如+3 表示[4,∞] +表示多少天以上
-#: [0,#)如-3 表示[0,3) -表示多少天以內
例如:查找/var目錄下最近一周內其內容修改過,同時屬主不為root,也不是postfix的文件
find /var/ -mtime -7 -not -user root -not -user postfix -ls
以“分鐘”為單位:(用法同上面的以“天”為單位)
-amin
-mmin
-cmin
八、 基於權限:
-perm mode:精確權限匹配
比如,查找/etc下權限是644且以.cfg結尾的文件:
find /etc/ -perm 644 -name "*.cfg"
+mode[/mode] 任何一類(u,g,o)對象的權限中只要能一位匹配即可,是‘或’關系,+ 從 centos7開始淘汰
比如查找/root/bin下屬主或者屬組或者其他人有讀和執行權限的文件:
find /etc/ -perm /555
-mode 每一類對象都必須同時擁有指定權限,‘與’關系,0表示不關註,一定要註意0不是沒有權限,是忽略,可有可無!!
比如查找/root/bin下屬主以及屬組以及其他人都有讀和執行權限的文件:
find /root/bin -perm -555
(二)處理動作:
1、-print 默認,打印出文件名
2、-delete 直接刪除所查找到的文件,不詢問。
比如刪除/tmp下,元數據修改時間超過3天且屬主是chen的文件:
find /tmp -ctime +3 -user chen -delete
3、-ls 長列出所查找到的文件
比如查找/root/bin下屬主以及屬組以及其他人都有讀和執行權限的文件,並且長列出:
find /root/bin -perm /555 -ls
4、-fls file 將查找到的文件長列出導入到指定文件,也可以使用 > file
比如查找/root/bin下屬主以及屬組以及其他人都有讀和執行權限的文件,將其導入/app/aaa
find /root/bin -perm /555 -fls /app/aaa 或者
find /root/bin -perm /555 > /app/aaa
5、-ok command \; 對查找到的文件當做下一命令的參數去執行(交互式),執行每一個文件時都會詢問.
比如刪除/app下以數字結尾的文件:
find /app -name "*[[:digit:]]" -ok rm {} \;
[:digit:]表示任意數字0-9,{}表示前面查找到的所有文件,\與命令之間要有空格!
6、-exec command \; 對查找到的文件當做下一命令的參數去執行(非交互式),不詢問。與-ok對比會發現兩者區別是-ok執行命令前詢問,-exec不詢問(如下圖所示)
7、|xargs :用於產生某個命令的參數(不單單只能用在find中)
有時候有些命令不支持管道,而且執行rm,touch等命令時,對參數個數有一定限制,此時就可以使用|xargs將查找到的文件通過|xargs進行傳參,這種傳參相當於一個一個傳。
例:查找/sbin下屬主權限為滿的文件,並且詳細列出
find /sbin -perm /700 |xargs ls -l
通過上圖比較可發現直接使用|查找到的內容並不是自己想要的,所以使用find時要用|xargs
下面舉了一些有增強性的題來鞏固一下上面的內容:
1、查找家目錄下其他人有寫權限的文件,取消其寫權限。
find ~ -perm -002 -exec chmod o-w {} \;
2、查找/data下權限是644且以.sh結尾的普通文間件,修改權限為755。
find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \;
3、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件
find / -nouser -o -nogroup -a -atime -7
4、查找/etc目錄下所有用戶都沒有寫權限的文件
find /etc ! -perm /222 -ls
5、查找/etc目錄下至少有一類用戶沒有執行權限的文件
find /etc ! -perm -111 -ls
以上就是博主對於find的理解,如有不同意見,歡迎留言!!希望能對大家有所幫助
謝謝!!
查找命令find的用法