工作中經常會用到根據檔案的類型、名字、權限、通路時間、屬主、屬組等等屬性來查找系統中檔案的需求,本文就詳細介紹下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
[root@localhost woniu]# find /woniu/ -iname zyc
/woniu/Zyc
我們看到,以大寫Z開頭的和以小寫z開頭的都被查找出來了,這就是-name和-iname的差別;
同時,根據檔案名查找檔案還支援glob風格的通配,可以通過比對元字元*、?等來查找檔案;例如:
查找/woniu目錄下以zyc開頭的檔案:
[root@localhost woniu]# ls
[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
[root@localhost woniu]# find /woniu -group woniu
/woniu/woniu1
-uid查找屬主指定UID的所有檔案,例如:
通過id -u zyc可知,zyc使用者的uid為4007,查找/woniu目錄下uid為4007的檔案,其實就是查找屬主為zyc的檔案;
[root@localhost woniu]# id -u zyc
4007
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc1
-rw-r--r-- 1 zyc zyc 0 Dec 18 18:09 zyc12
[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]# find /woniu -group 4004
-nouser查找沒有屬主的檔案,例如:
查找/woniu目錄下沒有屬主的檔案;由ll指令可知woniu目錄下的woniuw檔案沒有了屬主;
-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
-nogroup查找沒有屬組的檔案,例如:
查找/woniu目錄下沒有屬組的檔案;
[root@localhost woniu]# find /woniu -nogroup
3、根據檔案類型查找-type,其中檔案的類型有:f表示普通檔案、d表示目錄檔案、l表示符号連結檔案、b表示塊裝置檔案、c表示字元裝置檔案、s表示套接字檔案、p表示管道檔案;例如:
查找/woniu目錄下的普通檔案:
[root@localhost woniu]# find /woniu -type f
/woniu/zyc123
/woniu/Zyc
/woniu/text.txt
/woniu/zyc
查找/woniu目錄下的目錄檔案:
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
786485 4 -rwxr-xr-x 1 root root 37 Dec 12 20:00/woniu/text.txt
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的檔案并删除:
-rw-rw-rw- 1 root root 0 Dec 18 17:46 zyc
-rw-rw-rw- 1 zyc zyc 0 Dec 18 18:09 zyc1
[root@localhost woniu]# find /woniu -name zyc -exec rm -f {} \;
以上指令結果等同于:
-rw-r--r-- 1 root root 0 Dec 18 19:52 zyc
[root@localhost woniu]# find /woniu -name zyc | xargs rm -f