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,來看下邊的: