工作中經常會用到根據文件的類型、名字、權限、訪問時間、屬主、屬組等等屬性來查找系統中文件的需求,本文就詳細介紹下linux系統中查找文件的命令find的用法;
首先,介紹下find工具:find是一款實時的查找工具,其通過遍歷指定起始路徑下的文件系統層級結構來完成文件的查找工作,由於其是實時查找、精確查找,所以它的查找速度略慢;下面就詳細介紹下此命令的用法:
用法:find [OPTIONS][查找起始路徑][查找條件][處理動作]
其中,查找起始路徑表示指定具體的搜索目標的起始路徑,默認爲當前工作目錄,用./表示;
查找條件表示指定的查找標準,可根據文件名、大小、類型、從屬關係等等標準,默認爲找出指定路徑下的所有文件;
處理動作表示對符合查找條件的文件做出的動作,例如刪除,移動等等操作,默認爲輸出至標準輸出;
具體的查找條件類型及示例:
1、根據文件名查找:-name,-iname
-name根據文件名查找,區分大小寫,例如:
查找/woniu目錄下名字爲zyc的文件:
[root@localhost woniu]# ls
text.txt zyc Zyc zyc123
[root@localhost woniu]# find /woniu/ -name zyc
/woniu/zyc
-iname根據文件名查找,不區分大小寫,例如:
同樣查找/woniu目錄下名字爲zyc的文件:
[root@localhost woniu]# ls
text.txt zyc Zyc zyc123
[root@localhost woniu]# find /woniu/ -iname zyc
/woniu/Zyc
/woniu/zyc
我們看到,以大寫Z開頭的和以小寫z開頭的都被查找出來了,這就是-name和-iname的區別;
同時,根據文件名查找文件還支持glob風格的通配,可以通過匹配元字符*、?等來查找文件;例如:
查找/woniu目錄下以zyc開頭的文件:
[root@localhost woniu]# ls
text.txt zyc Zyc zyc123
[root@localhost woniu]# find /woniu -name "zyc*"
/woniu/zyc123
/woniu/zyc
注意:此處用的是-name,所以以大寫Z開頭的沒有被查找出來;
查找/woniu目錄下以zyc開頭,後面跟一個字符的文件:
[root@localhost woniu]# ls
text.txt zyc Zyc zyc1 zyc12 zyc123
[root@localhost woniu]# find /woniu -name "zyc?"
/woniu/zyc1
2、根據文件的從屬關係來查找文件;-user、-group、-uid、-gid、-nouser、-nogroup
-user根據文件的屬主來查找文件,例如:
查找/woniu目錄下屬主爲woniu的文件:
[root@localhost woniu]# ll
total 4
-rwxr-xr-x 1 root root 37 Dec 12 20:00 text.txt
-rw-r--r-- 1 woniu woniu 0 Dec 18 18:16 woniu
-rw-r--r-- 1 root woniu 0 Dec 18 18:16 woniu1
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc
-rw-r--r-- 1 root root 0 Dec 18 17:54 Zyc
-rw-r--r-- 1 root root 0 Dec 18 18:09 zyc1
-rw-r--r-- 1 root root 0 Dec 18 18:09 zyc12
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc123
[root@localhost woniu]# find /woniu -user woniu
/woniu/woniu
-group根據文件的屬組來查找文件,例如:
查找/woniu目錄下屬組爲/woniu的文件:
[root@localhost woniu]# ll
total 4
-rwxr-xr-x 1 root root 37 Dec 12 20:00 text.txt
-rw-r--r-- 1 woniu woniu 0 Dec 18 18:16 woniu
-rw-r--r-- 1 root woniu 0 Dec 18 18:16 woniu1
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc
-rw-r--r-- 1 root root 0 Dec 18 17:54 Zyc
-rw-r--r-- 1 root root 0 Dec 18 18:09 zyc1
-rw-r--r-- 1 root root 0 Dec 18 18:09 zyc12
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc123
[root@localhost woniu]# find /woniu -group woniu
/woniu/woniu1
/woniu/woniu
-uid查找屬主指定UID的所有文件,例如:
通過id -u zyc可知,zyc用戶的uid爲4007,查找/woniu目錄下uid爲4007的文件,其實就是查找屬主爲zyc的文件;
[root@localhost woniu]# id -u zyc
4007
[root@localhost woniu]# ll
total 4
-rwxr-xr-x 1 root root 37 Dec 12 20:00 text.txt
-rw-r--r-- 1 woniu woniu 0 Dec 18 18:16 woniu
-rw-r--r-- 1 root woniu 0 Dec 18 18:16 woniu1
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc
-rw-r--r-- 1 root root 0 Dec 18 17:54 Zyc
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc1
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc12
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc123
[root@localhost woniu]# find /woniu -uid 4007
/woniu/zyc1
/woniu/zyc12
-gid查找屬組指定GID的所有文件,例如:
通過id -g woniu可知,woniu用戶的uid爲4004,查找/woniu目錄下gid爲4004的文件,和查找屬組爲woniu的文件結果一樣 ;
[root@localhost woniu]# id -g woniu
4004
[root@localhost woniu]# ll
total 4
-rwxr-xr-x 1 root root 37 Dec 12 20:00 text.txt
-rw-r--r-- 1 woniu woniu 0 Dec 18 18:16 woniu
-rw-r--r-- 1 root woniu 0 Dec 18 18:16 woniu1
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc
-rw-r--r-- 1 root root 0 Dec 18 17:54 Zyc
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc1
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc12
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc123
[root@localhost woniu]# find /woniu -group 4004
/woniu/woniu1
/woniu/woniu
-nouser查找沒有屬主的文件,例如:
查找/woniu目錄下沒有屬主的文件;由ll命令可知woniu目錄下的woniuw文件沒有了屬主;
[root@localhost woniu]# ll
total 4
-rwxr-xr-x 1 root root 37 Dec 12 20:00 text.txt
-rw-r--r-- 1 4004 4004 0 Dec 18 18:16 woniu
-rw-r--r-- 1 root 4004 0 Dec 18 18:16 woniu1
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc
-rw-r--r-- 1 root root 0 Dec 18 17:54 Zyc
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc1
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc12
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc123
[root@localhost woniu]# find /woniu -nouser
/woniu/woniu
-nogroup查找沒有屬組的文件,例如:
查找/woniu目錄下沒有屬組的文件;
[root@localhost woniu]# ll
total 4
-rwxr-xr-x 1 root root 37 Dec 12 20:00 text.txt
-rw-r--r-- 1 4004 4004 0 Dec 18 18:16 woniu
-rw-r--r-- 1 root 4004 0 Dec 18 18:16 woniu1
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc
-rw-r--r-- 1 root root 0 Dec 18 17:54 Zyc
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc1
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc12
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc123
[root@localhost woniu]# find /woniu -nogroup
/woniu/woniu1
/woniu/woniu
3、根據文件類型查找-type,其中文件的類型有:f表示普通文件、d表示目錄文件、l表示符號鏈接文件、b表示塊設備文件、c表示字符設備文件、s表示套接字文件、p表示管道文件;例如:
查找/woniu目錄下的普通文件:
[root@localhost woniu]# ll
total 4
-rwxr-xr-x 1 root root 37 Dec 12 20:00 text.txt
-rw-r--r-- 1 4004 4004 0 Dec 18 18:16 woniu
-rw-r--r-- 1 root 4004 0 Dec 18 18:16 woniu1
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc
-rw-r--r-- 1 root root 0 Dec 18 17:54 Zyc
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc1
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc12
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc123
[root@localhost woniu]# find /woniu -type f
/woniu/zyc123
/woniu/zyc1
/woniu/Zyc
/woniu/woniu1
/woniu/zyc12
/woniu/text.txt
/woniu/woniu
/woniu/zyc
查找/woniu目錄下的目錄文件:
[root@localhost woniu]# ll
total 8
drwxr-xr-x 2 root root 4096 Dec 18 18:46 linux
-rwxr-xr-x 1 root root 37 Dec 12 20:00 text.txt
-rw-r--r-- 1 4004 4004 0 Dec 18 18:16 woniu
-rw-r--r-- 1 root 4004 0 Dec 18 18:16 woniu1
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc
-rw-r--r-- 1 root root 0 Dec 18 17:54 Zyc
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc1
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc12
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc123
[root@localhost woniu]# find /woniu -type d
/woniu
/woniu/linux
4、根據文件的大小查找-size,其中-size後面跟數字加單位表示大小,數字前面也可以跟加減號,表示小於或大於,例如
查找根目錄下大小爲10M的目錄或文件:
[root@localhost woniu]# find / -size 10M
查找根目錄下小於10M的文件或目錄:
[root@localhost woniu]# find / -size -10M
查找根目錄下大於10M的文件或目錄:
[root@localhost woniu]# find / -size +10M
5、根據文件的時間戳來查找,文件的時間戳包括以"天"爲單位的atime、ctime、mtime和以"分鐘"爲單位的amin、mmin、cmin,其中atime表示文件的訪問時間;ctime表示文件的創建時間;mtime表示文件的修改時間;同理amin、mmin、cmin和atime、ctime、mtime一樣,只不過是以分鐘爲單位;這些也可以像表示文件大小的size一樣,前面跟加減號來表示幾天前幾天後及幾分鐘前和幾分鐘後的時間;例如:
查找根目錄下3天前訪問過的文件或目錄:
[root@localhost woniu]# find / -atime +3
查找根目錄下3天內修改過的文件或目錄:
[root@localhost woniu]# find / -mtime -3
查找根目錄下3天內修改過的文件或目錄:
6、根據權限來查找文件:-perm [/|-] mode,其中mode表示精確匹配權限;/mode表示任何一類用戶(u,g,o)的權限中的任何一位(r,w,x)符合條件即足;-mode表示每一類用戶(u,g,o)的權限中的每一位(r,w,x)同時符合條件即滿足;例如:
查找/woniu目錄下權限爲644的文件:
[root@localhost woniu]# find /woniu -type f -perm 644 -ls
786484 0 -rw-r--r-- 1 root root 0 Dec 18 17:46 /woniu/zyc123
786439 0 -rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 /woniu/zyc1
786438 0 -rw-r--r-- 1 root root 0 Dec 18 17:54 /woniu/Zyc
786488 0 -rw-r--r-- 1 root 4004 0 Dec 18 18:16 /woniu/woniu1
786486 0 -rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 /woniu/zyc12
786487 0 -rw-r--r-- 1 4004 4004 0 Dec 18 18:16 /woniu/woniu
786458 0 -rw-r--r-- 1 root root 0 Dec 18 17:46 /woniu/zyc
查找/woniu目錄下任意一類用戶有寫權限的文件:
[root@localhost woniu]# find /woniu -type f -perm /222 -ls
786484 0 -rw-r--r-- 1 root root 0 Dec 18 17:46 /woniu/zyc123
786439 0 -rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 /woniu/zyc1
786438 0 -rw-r--r-- 1 root root 0 Dec 18 17:54 /woniu/Zyc
786488 0 -rw-r--r-- 1 root 4004 0 Dec 18 18:16 /woniu/woniu1
786486 0 -rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 /woniu/zyc12
786485 4 -rwxr-xr-x 1 root root 37 Dec 12 20:00/woniu/text.txt
786487 0 -rw-r--r-- 1 4004 4004 0 Dec 18 18:16 /woniu/woniu
786458 0 -rw-r--r-- 1 root root
查找/woniu目錄下所有用戶都有寫權限的文件:
[root@localhost woniu]# find /woniu -type f -perm -222 -ls
786439 0 -rw-rw-rw- 1 zyc zyc 0 Dec 18 18:09 /woniu/zyc1
786458 0 -rw-rw-rw- 1 root root 0 Dec 18 17:46 /woniu/zyc
以上的條件也可以組合起來進行匹配查找,組合匹配的關係有-a:表示與關係,前後條件都滿足即滿足;-o:表示或關係,前後條件只要一個滿足即滿足;-not:表示非關係,用來查找與匹配條件相反的操作,也可以用!代替;比如:
查找/var目錄下屬主爲root,且屬組爲mail的所有文件或目錄
find /var/ -user root -a -groupmail
查找/usr目錄下不屬於root,bin或hadoop的所有文件或目錄;用兩種方法;
(1)、find /usr/ -not -user root -a -not -user bin -a -not-user hadoop
(2)、find /usr/ -not \( -user root -o -user bin -o -userhadoop \) #注意:括號內前後有空格
查找/etc目錄下最近一週其內容修改過,且屬主不是root用戶也不是hadoop用戶的文件或目錄;
(1)、find /etc/ -mtime -7 -a -not -user root -a -not -userhadoop
(2)、find /etc/ -mtime -7 -not \( -user root -o -user hadoop\)
查找當前系統上沒有屬主或屬組,且最近一週內曾被訪問過的文件或目錄
find / \( -nouser -o -nogroup\) -atime -7
查找/etc目錄下大於1M且類型爲普通文件的所有文件;
find /etc/ -size +1M -type f
查找/etc目錄下所有用戶都沒有寫權限的文件;(所有用戶都沒有表示任意一類用戶都沒有)
find /etc/ -not -perm /222-type f
查找/etc目錄下至少有一類用戶沒有執行權限的文件;(至少有一類沒有表示不是所有用戶都有)
find /etc/ -not -perm -111-type f
查找/etc/init.d/目錄下,所有用戶都有執行權限,且其它用戶有寫權限的所有文件;
find /etc/init.d/ -perm -111-perm -002 -type f
介紹完了查找條件接下來介紹下處理動作,包括:
-print:輸出至標準輸出;默認的動作; -ls:類似於對查找到的文件執行“ls -l”命令,輸出文件的詳細信息 -delete:刪除查找到的文件 -fls /PATH/TO/SOMEFILE:把查找到的所有文件的長格式信息保存至指定文件中; -ok COMMAND {} \; :對查找到的每個文件執行COMMAND命令;對於執行結果需要用戶確認 -exec COMMAND {} \; :對查找到的每個文件執行COMMAND命令;不需要用戶確認;注意:find傳遞查找到的文件至後面的命令時,是先查找出所有符合條件的文件路徑,並一次性傳遞給後面的命令;但是有些命令不能接受過長的參數,此時命令執行會失敗,另外一種方式可規避此問題:find xargsCOMMAND
比如:
查找/woniu目錄下文件名是zyc的文件並刪除:
[root@localhost woniu]# ll
total 8
drwxr-xr-x 2 root root 4096 Dec 18 18:46 linux
-rwxr-xr-x 1 root root 37 Dec 12 20:00 text.txt
-rw-r--r-- 1 4004 4004 0 Dec 18 18:16 woniu
-rw-r--r-- 1 root 4004 0 Dec 18 18:16 woniu1
-rw-rw-rw- 1 root root 0 Dec 18 17:46 zyc
-rw-r--r-- 1 root root 0 Dec 18 17:54 Zyc
-rw-rw-rw- 1 zyc zyc 0 Dec 18 18:09 zyc1
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc12
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc123
[root@localhost woniu]# find /woniu -name zyc -exec rm -f {} \;
[root@localhost woniu]# ll
total 8
drwxr-xr-x 2 root root 4096 Dec 18 18:46 linux
-rwxr-xr-x 1 root root 37 Dec 12 20:00 text.txt
-rw-r--r-- 1 4004 4004 0 Dec 18 18:16 woniu
-rw-r--r-- 1 root 4004 0 Dec 18 18:16 woniu1
-rw-r--r-- 1 root root 0 Dec 18 17:54 Zyc
-rw-rw-rw- 1 zyc zyc 0 Dec 18 18:09 zyc1
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc12
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc123
以上命令結果等同於:
[root@localhost woniu]# ll
total 8
drwxr-xr-x 2 root root 4096 Dec 18 18:46 linux
-rwxr-xr-x 1 root root 37 Dec 12 20:00 text.txt
-rw-r--r-- 1 4004 4004 0 Dec 18 18:16 woniu
-rw-r--r-- 1 root 4004 0 Dec 18 18:16 woniu1
-rw-r--r-- 1 root root 0 Dec 18 19:52 zyc
-rw-r--r-- 1 root root 0 Dec 18 17:54 Zyc
-rw-rw-rw- 1 zyc zyc 0 Dec 18 18:09 zyc1
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc12
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc123
[root@localhost woniu]# find /woniu -name zyc | xargs rm -f
[root@localhost woniu]# ll
total 8
drwxr-xr-x 2 root root 4096 Dec 18 18:46 linux
-rwxr-xr-x 1 root root 37 Dec 12 20:00 text.txt
-rw-r--r-- 1 4004 4004 0 Dec 18 18:16 woniu
-rw-r--r-- 1 root 4004 0 Dec 18 18:16 woniu1
-rw-r--r-- 1 root root 0 Dec 18 17:54 Zyc
-rw-rw-rw- 1 zyc zyc 0 Dec 18 18:09 zyc1
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc12
-rw-r--r-- 1 root root 0 Dec 18 17:46 zyc123