linux文件查找工具-find(詳細)

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]

  1. -perm mode
    精確查找,文件權限正好等於mode,mode爲類似於chmod的屬性值
  2. -perm -mode
    每一類對象都必須擁有其指定的權限標準
  3. -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 ""
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章