Linux系統常用的檔案查找指令是:locate和find兩個指令。
相對來說,locate指令由于系統會自動周期性的建構索引庫,是以要比find指令查找速度要快,但是locate指令對由于其于檔案的查找主要依賴于事先建構好的索引庫,是以隻能對檔案進行模糊比對,同時在精确度上來說比find差了很多,也無法準确反映系統檔案的真實相關情況。
下面重點說下find指令。
使用格式 : find [查找起始路徑] [查找條件或規則] [查找完後所執行的動作]
[查找起始路徑]: find指令在不指定查找目錄的情況下,預設是對目前目錄進行周遊查找。
[查找條件或規則] :指定的查找标準,可以根據檔案名、大小、類型、從屬關系、權限等等标準進行;預設為找出指定路徑下的所有檔案;
[查找完後所執行的動作]:對符合查找條件的檔案做出的操作,例如删除等操作;預設為輸出至标準輸出;
(1)根據檔案名查找:
-name "pattern"
-iname "pattern"
-regex pattern:基于正規表達式模式查找檔案,比對是整個路徑,而非其名;
(2)檔案類型:-type
f :普通檔案 ,
d: 目錄檔案 ,
l :符号連結檔案 ,
p :管道檔案 ,
c :字元裝置檔案 ,
b: 塊裝置檔案,
s :socket套接字檔案
(3)根據檔案從屬關系查找:
-user USERNAME:查找屬主指定使用者的所有檔案;
-group GRPNAME:查找屬組指定組的所有檔案;
-uid UID:查找屬主指定的UID的所有檔案;
-gid GID:查找屬組指定的GID的所有檔案;
-nouser:查找沒有屬主的檔案;
-nogroup:查找沒有屬組的檔案;
[root@xlogin data]# find -type f -ls
19150 0 -rw-r--r-- 1 root root 0 12月 16 21:24 ./file/type-f
[root@xlogin data]# find -name file -ls
19149 0 drwxr-xr-x 2 user3 user3 6 12月 16 21:25 ./file
[root@xlogin data]# userdel -r user1
[root@xlogin data]# find /data -nouser -ls
67227040 0 drwxr-xr-x 2 1001 user3 6 12月 16 21:25 /data/nouser
[root@xlogin data]# userdel -r user2
[root@xlogin data]# find /data -nogroup -ls
100664274 0 drwxr-xr-x 2 user3 1002 6 12月 16 21:25 /data/nogroup
[root@xlogin data]# find /data -user user3 -ls
100664274 0 drwxr-xr-x 2 user3 1002 6 12月 16 21:25 /data/nogroup
19149 0 drwxr-xr-x 2 user3 user3 19 12月 16 21:34 /data/file
[root@xlogin data]# find /data -iname nogroup -ls
100664274 0 drwxr-xr-x 2 user3 1002 6 12月 16 21:25 /data/nogroup
33558009 0 drwxr-xr-x 2 root root 6 12月 16 21:36 /data/NOGROUP
(4)組合測試:
與:-a, 預設組合邏輯,兩者必須滿足
或:-o 滿足其中一個條件即可
非:-not, !非
/data目錄下所有屬于gid為1003,但屬主不是root的所有檔案,且類型為檔案。
[root@xlogin data]# find /data/ -type f -a -gid 1003 -ls
19150 0 -rw-r--r-- 1 root user3 0 12月 16 21:34 /data/file/type-f
19542 0 -rw-r--r-- 1 user3 user3 0 12月 16 21:54 /data/file/test
[root@xlogin data]# find /data/ -type f -a -gid 1003 -not -user root -ls
19542 0 -rw-r--r-- 1 user3 user3 0 12月 16 21:54 /data/file/test
(5)根據檔案的大小查找:
-size [+|-]#UNIT
常用機關:k, M, G
[root@xlogin data]# find /usr/bin/ -size 60k -ls
2051046 60 -rwxr-xr-x 1 root root 60784 3月 6 2015 /usr/bin/pactl
[root@xlogin data]# find /usr/bin/ -size +10M -ls
680027 10284 -rwxr-xr-x 1 root root 10527312 6月 10 2014 /usr/bin/virtuoso-t
[root@xlogin data]# du -sh /usr/bin/virtuoso-t
11M /usr/bin/virtuoso-t
(6)根據時間戳查找:
以“天”為機關:
-atime :Access, 最近通路時間
-mtime :Modify,最近修改時間
-ctime :Change,最近改變時間
以“分鐘”為機關:
-mtime -n +n #按檔案更改時間來查找檔案,-n指n天以内,+n指n天以前
-atime -n +n #按檔案通路時間來查找檔案,-n指n天以内,+n指n天以前
-ctime -n +n #按檔案建立時間來查找檔案,-n指n天以内,+n指n天以前
[root@xlogin data]# stat /data/passwd
檔案:"/data/passwd"
大小:27832 塊:56 IO 塊:4096 普通檔案
裝置:802h/2050d Inode:67227040 硬連結:1
權限:(0755/-rwxr-xr-x) Uid:( 0/ root) Gid:( 0/ root)
環境:unconfined_u:object_r:default_t:s0
最近通路:2015-12-16 22:18:59.441496670 +0800
最近更改:2015-12-16 22:18:59.467496708 +0800
最近改動:2015-12-16 22:18:59.467496708 +0800
建立時間:-
[root@xlogin data]# chmod 644 /data/passwd
[root@xlogin data]# stat /data/passwd #檔案的ctime發生了變化
檔案:"/data/passwd"
大小:27832 塊:56 IO 塊:4096 普通檔案
裝置:802h/2050d Inode:67227040 硬連結:1
權限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
環境:unconfined_u:object_r:default_t:s0
最近通路:2015-12-16 22:18:59.441496670 +0800
最近更改:2015-12-16 22:18:59.467496708 +0800
最近改動:2015-12-16 22:19:50.777569674 +0800
建立時間:-
[root@xlogin data]# cat /bin/lsattr >/data/passwd #檔案的ctime和mtime都發生了變化
[root@xlogin data]# stat /data/passwd
檔案:"/data/passwd"
大小:11520 塊:24 IO 塊:4096 普通檔案
裝置:802h/2050d Inode:67227040 硬連結:1
權限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
環境:unconfined_u:object_r:default_t:s0
最近通路:2015-12-16 22:18:59.441496670 +0800
最近更改:2015-12-16 22:20:42.573643324 +0800
最近改動:2015-12-16 22:20:42.573643324 +0800
建立時間:-
[root@xlogin data]# touch /data/passwd
[root@xlogin data]# stat /data/passwd #檔案的atime、ctime、mtime均發生了變化。
檔案:"/data/passwd"
大小:11520 塊:24 IO 塊:4096 普通檔案
裝置:802h/2050d Inode:67227040 硬連結:1
權限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
環境:unconfined_u:object_r:default_t:s0
最近通路:2015-12-16 22:22:43.312815007 +0800
最近更改:2015-12-16 22:22:43.312815007 +0800
最近改動:2015-12-16 22:22:43.312815007 +0800
建立時間:-
經過測試,我們得出結論:
無論檔案的屬性還是内容發生變化,檔案的ctime都會發生改變,但隻有檔案的内容發生修改時,檔案的mtime才會發生變化。當對檔案内容進行檢視等操作時,檔案的atime則會發生變化。
查找var目錄下,1天内被更改過的檔案
[root@xlogin data]# find /var -mtime -1 -type f -print
查找var目錄下,2天前被更改過的檔案
[root@xlogin data]# find /var/ -mtime +2 -type f
查找var目錄下,7天内被通路過的檔案
[root@xlogin data]# find /var/ -atime -7 -type f
查找var目錄下,7天前被通路的檔案
[root@xlogin data]# find . -atime +7 -type f
查找var目錄下,一天内狀态被改變的檔案
[root@xlogin data]# find . -ctime -1 -type f -print
查找var目錄下,一天前狀态被改變的檔案
[root@xlogin data]# find . -ctime +1 -type f -print
查找var目錄下,10分鐘以前狀态被改變的檔案
[root@xlogin data]# find . -cmin +10 -type f -print
(8)根據權限查找:
-perm [/|-]mode
- mode:精确權限比對;
- /mode:任何一類使用者(u,g,o)的權限中的任何一位(r,w,x)符合條件即滿足,9位權限之間存在“或”關系;
- -mode:每一類使用者(u,g,o)的權限中的每一位(r,w,x)同時符合條件即滿足,9位權限之間存在“與”關系;
查找/etc目錄下所有使用者都沒有寫權限的檔案;
[root@xlogin data]# find /etc -not -perm /222 -type f -ls
查找/etc目錄至少有一類使用者沒有執行權限的檔案;
[root@xlogin data]# find /etc -not -perm -111 -type f -ls
(9)處理動作:
- -print:輸出至标準輸出;預設的動作;
- -ls:類似于對查找到的檔案執行“ls -l”指令,輸出檔案的詳細資訊;
- -delete:删除查找到的檔案;
- -fls /PATH/TO/SOMEFILE:把查找到的所有檔案的長格式資訊儲存至指定檔案中;
- -ok COMMAND {} \; :對查找到的每個檔案執行由COMMAND表示的指令;每次操作都由使用者進行确認;
- -exec COMMAND {} \; :對查找到的每個檔案執行由COMMAND表示的指令;
注意:find傳遞查找到的檔案路徑至後面的指令時,是先查找出所有符合條件的檔案路徑,并一次性傳遞給後面的指令;
[root@xlogin data]# find . -name 'del.txt' -ok rm {} \; #查找del.txt并删除,删除前提示确認
[root@xlogin data]# find . -name 'aa.txt' -exec cp {} {}.bak \; #查找aa.txt 并備份為aa.txt.bak
在使用find指令的-exec選項處理比對到的檔案時,find指令将所有比對到的檔案一起傳遞給exec執行。
但是有些指令不能接受過長的參數,這樣在find指令運作幾分鐘之後,就會出現溢出錯誤。錯誤資訊通常是“參數列太長”或“參數列溢出”。這種情況下,也就正是xargs指令出現的時候了,xargs是一條Unix和類Unix作業系統的常用指令。它的作用是将參數清單轉換成小塊分段傳遞給其他指令,以避免參數清單過長的問題。
find指令把比對到的檔案傳遞給xargs指令,而xargs指令每次隻擷取一部分檔案而不是全部,不像-exec選項那樣。這樣它可以先處理最先擷取的一部分檔案,然後是下一批,并如此繼續下去。
在有些系統中,使用-exec選項會為處理每一個比對到的檔案而發起一個相應的程序,并非将比對到的檔案全部作為參數一次執行;這樣在有些情況下就會出現程序過多,系統性能下降的問題,因而效率不高,而使用xargs指令則隻有一個程序。另外,在使用xargs指令時,究竟是一次擷取所有的參數,還是分批取得參數,以及每一次擷取參數的數目都會根據該指令的選項及系統核心中相應的可調參數來确定。
另外很多時候,有些指令不支援使用| 管道來傳遞參數,但是我們又必須使用,是以這個時候就是xargs大展身手的時候了!
先看幾個普通的例子:
[root@xlogin data]# ll test/
總用量 8
dr-xr-xr-x. 4 root root 4096 12月 16 22:36 boot
-rw-r--r--. 1 root root 1750 12月 16 22:36 passwd
[root@xlogin data]# find /data/test/ -type f -exec rm {} \;
[root@xlogin data]# ls test/
boot
[root@xlogin data]# ll /data/test/boot/
總用量 0
drwxr-xr-x. 2 root root 6 12月 16 22:37 grub
drwxr-xr-x. 6 root root 58 12月 16 22:37 grub2
[root@xlogin data]# find /data/test/ -type f |xargs rm -rf
[root@xlogin data]# ll /data/
總用量 0
OK,來看下邊的: