1. 程式人生 > >查找命令find的用法

查找命令find的用法

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的用法