find命令
1. find命令特點
- 實時查找
- 文件遍歷
- 精確匹配
- 可以使用正則表達式模糊查詢
- 速度較慢(缺點)
2. 根據文件名查找
可以使用正則匹配的方式進行模糊查詢,查找指定文件夾下的匹配的文件或文件夾。
# 當前目錄下的passwd文件
find ./ -name "passwd"
# 根目錄下的以passwd結尾,開頭未知的文件
find / -name "*passwd*"
# /etc目錄下的以shadow開頭,結尾位置的文件
find /etc -name "shadow*"
# /var目錄下的文件名中含有nginx字符串的文件
find /var -name "*nginx*"
3. 根據文件的屬主屬組查找
可以根據文件或文件夾的屬主屬組查找文件,還可以查找沒有屬主屬組的文件然後進行處理。
- -user:屬主
- -group:屬組
- -uid:根據文件的uid實現精確查找
- -gid:根據文件的gid實現精確查找
- -nouser,-nogroup:對於已經被刪除用戶名或用戶組的文件,系統只會保留相應的gid,uid號碼用以標識,而如果此時新建一個用戶名就用可能取得某些文件的管理權限,出於安全的考慮,所以要對這些文件進行查找,保證安全
# 當前目錄下屬主屬組都爲zhangpf的文件
find ./ -group=zhangpf -user=zhangpf
# /home/zhangpf目錄下屬組爲zhangpf屬組爲root,文件名中包含passwd的文件
find /home/zhangpf -user=zhangpf -group=root -name "*passwd*"
# 根目錄下沒有屬組和屬主的文件
find / -nouser -nogroup
- 沒有屬組屬主的文件,如果當有新的用戶添加進來之後,如果新用戶的gid或uid跟這些文件原來的gid或uid一樣,那麼這些文件就會屬於這個新的用戶,這也是一個安全隱患,一定要注意
4. 根據文件類型進行查找
根據文件類型進行查找:-type [文件類型]
f:普通文件
d:目錄文件
l:符號鏈接文件
s:套接字文件
b:塊處理設備文件
c:字符設備文件
p:管道文件
# 查找/tmp下的套接字文件
find /tmp -type s
# 查找/var下的套接字文件,且文件名中含有sock
find /var -type s -name "*sock*"
# 查找/etc下的符號鏈接文件
5. 根據文件大小進行查找
-size [+或-] [文件大小]
查找比SIZE還要大(+)或者小(-)的文件文件大小的表示:
c:代表byte,k:代表1024bytes,M:代表1024k,G:表示1024M
# 查找/root下大於100M的文件並用'ls -lh'命令顯示其屬性
find /root -size +100M -print | xargs ls -lh
# 查找/root下大於50M且小於100M的文件並列出其屬性信息
find /root -size +50M -a -size -100M -print | xargs ls -lh
6. 根據文件的時間進行查找
文件的時間有3種,mtime(Modify time,文件內容變更)、ctime(Change time,文件屬性變更)、atime(Access time,文件被訪問),以下詳細介紹
mtime:當文件的“內容數據” 更改時,就會更新這個時間。內容數據指的是文件的內容,而不是文件的屬性與權限
ctime:當文件的狀態發生變化時,就會更新這個數據,比如:權限與屬性發生變化
atime:當文件的內容被讀取時,就會更新這個時間以天爲單位查找:-ctime,-atime,-mtime
以分鐘爲單位查找:-cmin,-amin,-mmin-newer用在分辨兩個文件之間的新舊關係,默認以mtime爲準
對比文件的新舊程度查找:-newer,-anewer,-cnewer+4:代表大於等於五天前的文件名:find /var -mtime +4
-4: 代表小於等於四天內的文件名
4:代表4~5天那一天的文件
示例:
# 從現在開始到24小時之前有過改動的文件全部列出來
find / -mtime 0
# 尋找四天前的那一天被改動的文件
find /var -mtime 4
# 四天之內被改動過的文件
find /var -mctime -4
# 查找當前文件夾下10分鐘之內被修改的文件,並列出ctime信息
find . -cmin +10 -print | xargs ls -cl
# 尋找/etc下面的文件日期(mtime)比/etc/passwd新的文件
find /etc -newer /etc/passwd
#查找某個比文件file1新且比file2舊 的文件
find ~ -newer test1! test2 -print
7. 根據文件所屬的權限查找
根據文件權限進行查詢:-prem [option]
- -perm mode
精確查找,文件權限正好等於mode,mode爲類似於chmod的屬性值- -perm -mode
每一類對象都必須擁有其指定的權限標準- -perm /mode
任何一類(u,g,o)對象的權限只要有一位匹配即可
示例:
# 文件屬主屬組都有寫權限的,只要匹配一項就可以
find . -perm /u+w,g+w
# 文件屬主權限爲讀,或屬組權限爲讀的文件
find . -perm /u=w,g=w
# 文件屬性爲220(屬組或屬主爲可執行)的文件
find . -perm /220
#
find . -perm -444 -perm /222 ! -perm /111
find . -perm -a+r -perm /a+w ! -perm /a+x
8. 多條件查找
命令的組合用法
- 與:-a
- 或:-o
- 非:-not,-!
9. 其它相關
對於find查找出來的文件或文件夾,有時候需要做一些處理,下面介紹一下相關的命令
9.1. | xargs command ;
例:somecommand |xargs -item command
不帶command ,默認的使用echo 輸出
用途:
- 1.構造參數列表並運行命令,即將接收的參數傳遞給後面的command 命令執行
- 2.將多行輸入轉換爲單行 (特殊功效)
優點:
- 1.將輸入參數整理後,去除換行符,以一個列表形式處理
- 2.避免參數過長引發的問題,使用xargs -n 參數適當控制,對於經常產生大量輸出的命令如find、locate和grep來說非常有用
XARGS 一般是和管道一起使用:
XXcomand | xargs -x comand initial-args
-x 代表選項
選項:
-p:操作具有可交互性,每次執行comand都交互式提示用戶選擇
-i:-i選項告訴 xargs 可以使用{}代替傳遞過來的參數, 建議使用-I,其符合POSIX標準
參考:http://blog.csdn.net/hittata/article/details/8021500
# 查找當前文件夾下10分鐘之內被修改的文件,並列出ctime信息
find . -cmin +10 -print | xargs ls -cl
9.2. -delete:刪除查找到的文件
# 查找後顯示,然後刪除查找到的文件
find . -cmin -10 -print -delete
9.3. -fls /path/to/somefile
查找到的文件的長格式信息保存至指定的文件夾
find /var/log -ctime -4 -fls /tmp/test/abc
9.4. -ok command {} \ ;
對查找的文件執行由command指定的命令,對於每個文件執行命令之前,都會交互式要求用戶確認,與下面的-exec類似。
9.5. -exec command {} \;
對查找到的每個文件執行由command執行的命令
{}:用於引用查找到的文件名稱自身;
注意:find傳遞查找到的文件至後面指定的命令時,查找到的所有符合的文件一次性傳遞給後面的命令
find -exec 與xargs 區別
參考:http://blog.csdn.net/hittata/article/details/8021006
例:
find . -name "*.txt" -exec rm {} \;
find . -name "*.txt" | xargs rm {}
-exec
1.參數是一個一個傳遞的,傳遞一個參數執行一次rm
2.文件名有空格等特殊字符也能處理
-xargs
1.一次將參數傳給命令,可以使用-n控制參數個數
2.處理特殊文件名需要採用如下方式:
find . -name "*.txt" print0 |xargs -0 rm {}
示例
1.查找/var 目錄下屬主爲root,且屬組爲mail的所有文件或目錄並列出
find /var -user root -group mail -ls
2.查找/usr 目錄下不屬於root、bin、hadoop的所有文件或目錄
find /usr -not -user root -not -user hadoop -not -user bin -ls
find /usr -not \( -user root -o -user hadoop -o -not -user bin \) -ls
3.查找/etc目錄下最近一週內其內容修改過,同時屬主不爲root,也不爲hadoop的文件或目錄
find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls
4.查找當前系統上沒有屬主或屬組,且最近一週內曾被訪問過的文件或目錄
find / -ctmie -7 -a -nouser -a nogroup
5.查找/etc目錄下大於1M且類型爲普通文件的所有文件
find /etc -size +1M -a -type f -ls
6.查找/etc目錄下所有用戶都沒有寫權限的文件
find /etc -not -perm /222 -ls
7.查找/etc目錄下至少有一類用戶沒有執行權限的文件
find /etc -not -perm -111 -ls
8.查找/etc/init.d/目錄下,所有用戶都有執行權限,且其他用戶有寫權限的文件
find /etc/init.d -prem /113 -ls
9.查找/tmp/test/y目錄下在100分鐘內修改過的文件,並刪除
find /tmp/test/y -cmin -100 -print | xargs /bin/rm -fr
find /tmp/test/y -cmin -100 -delete
find /tmp/test/y -cmin -100 -ok rm -fr '{}' \; #需要詢問
find /tmp/test/y -cmin -100 -exec rm -fr '{}' \;
10.查找/var/log目錄下爲文件類型且在10分鐘內被修改過的文件,並列出
find /var/log -type f -cmin -10 -exec ls -l '{}' \;
11.查找/var/log下的在四天內被修改過的文件並把它們的長格式信息保存至/tmp/test/abc
find /var/log -ctime -4 -fls /tmp/test/abc
12.查找test.c並備份爲test.c.bak
find . -name "text.c" -exec cp {} {}.bak \;
13.查找文件名爲[]中的任意字符的文件
使用了通配符進行正則匹配
find ./ -name "[ab]"
14.查找目錄並列出目錄下的文件(爲找到的每一個目錄單獨執行ls命令,執行命令前需要確認)
find ./ -type d -ok ls {} \;
15.查找空文件或空目錄
find ./ -empty
16.查找空文件並刪除
find ./ -empty -type f -print -delete
17.查找名字符合正則表達式的文件,注意前面的‘.*’(查找到的文件帶有目錄)
find ./ -regex .*so.*\.gz
18.查找時忽略一個目錄或者多個目錄
find ./ ! -path "./output/*" ! -path "./output1/*" -type f | xargs grep ""