Linux命令-find命令

find命令

find命令用來在指定目錄下查找文件。任何位于參數之前的字符串都將被視為欲查找的目錄名。如果使用該命令時,不設置任何參數,則find命令將在當前目錄下查找子目錄與文件。并且將查找到的子目錄和文件全部進行顯示。

語法

find (選項) (參數)

選項

  • 常用參數
  • -name<范本樣式>:指定字符串作為尋找文件或目錄的范本樣式;
  • -iname<范本樣式>:此參數的效果和指定“-name”參數類似,但忽略字符大小寫的差別;
  • -type<文件類型>:只尋找符合指定的文件類型的文件;
  • -size<文件大小>:查找符合指定的文件大小的文件;
  • -perm<權限數值>:查找符合指定的權限數值的文件或目錄;
  • -fstype<文件系統類型>:只尋找該文件系統類型下的文件或目錄;
  • -mtime<24小時數>:查找在指定時間曾被更改過的文件或目錄,單位以24小時計算;
  • -mmin<分鐘>:查找在指定時間曾被更改過的文件或目錄,單位以分鐘計算;
  • -amin<分鐘>:查找在指定時間曾被存取過的文件或目錄,單位以分鐘計算;
  • -atime<24小時數>:查找在指定時間曾被存取過的文件或目錄,單位以24小時計算;
  • -ctime<24小時數>:查找在指定時間之時被更改的文件或目錄,單位以24小時計算;
  • -cmin<分鐘>:查找在指定時間之時被更改過的文件或目錄;
  • -print:假設find指令的回傳值為Ture,就將文件或目錄名稱列出到標準輸出。格式為每列一個名稱,每個名稱前皆有“./”字符串;
  • -fprint<列表文件>:此參數的效果和指定“-print”參數類似,但會把結果保存成指定的列表文件;
  • -printf<輸出格式>:假設find指令的回傳值為Ture,就將文件或目錄名稱列出到標準輸出。格式可以自行指定;
  • -fprintf<列表文件><輸出格式>:此參數的效果和指定“-printf”參數類似,但會把結果保存成指定的列表文件;
  • -exec<執行指令>:假設find指令的回傳值為True,就執行該指令;
  • -ok<執行指令>:此參數的效果和指定“-exec”類似,但在執行指令之前會先詢問用戶,若回答“y”或“Y”,則放棄執行命令;
  • 其他參數
  • -anewer<參考文件或目錄>:查找其存取時間較指定文件或目錄的存取時間更接近現在的文件或目錄;
  • -cnewer<參考文件或目錄>查找其更改時間較指定文件或目錄的更改時間更接近現在的文件或目錄;
  • -daystart:從本日開始計算時間;
  • -depth:從指定目錄下最深層的子目錄開始查找;
  • -expty:尋找文件大小為0 Byte的文件,或目錄下沒有任何子目錄或文件的空目錄;
  • -false:將find指令的回傳值皆設為False;
  • -fls<列表文件>:此參數的效果和指定“-ls”參數類似,但會把結果保存為指定的列表文件;
  • -follow:排除符號連接;
  • -fprint0<列表文件>:此參數的效果和指定“-print0”參數類似,但會把結果保存成指定的列表文件;
  • -gid<群組識別碼>:查找符合指定之群組識別碼的文件或目錄;
  • -group<群組名稱>:查找符合指定之群組名稱的文件或目錄;
  • -help或——help:在線幫助;
  • -ilname<范本樣式>:此參數的效果和指定“-lname”參數類似,但忽略字符大小寫的差別;
  • -inum<inode編號>:查找符合指定的inode編號的文件或目錄;
  • -ipath<范本樣式>:此參數的效果和指定“-path”參數類似,但忽略字符大小寫的差別;
  • -iregex<范本樣式>:此參數的效果和指定“-regexe”參數類似,但忽略字符大小寫的差別;
  • -links<連接數目>:查找符合指定的硬連接數目的文件或目錄;
  • -iname<范本樣式>:指定字符串作為尋找符號連接的范本樣式;
  • -ls:假設find指令的回傳值為Ture,就將文件或目錄名稱列出到標準輸出;
  • -maxdepth<目錄層級>:設置最大目錄層級;
  • -mindepth<目錄層級>:設置最小目錄層級;
  • -mount:此參數的效果和指定“-xdev”相同;
  • -newer<參考文件或目錄>:查找其更改時間較指定文件或目錄的更改時間更接近現在的文件或目錄;
  • -nogroup:找出不屬于本地主機群組識別碼的文件或目錄;
  • -noleaf:不去考慮目錄至少需擁有兩個硬連接存在;
  • -nouser:找出不屬于本地主機用戶識別碼的文件或目錄;
  • -path<范本樣式>:指定字符串作為尋找目錄的范本樣式;
  • -print0:假設find指令的回傳值為Ture,就將文件或目錄名稱列出到標準輸出。格式為全部的名稱皆在同一行;
  • -prune:不尋找字符串作為尋找文件或目錄的范本樣式;
  • -regex<范本樣式>:指定字符串作為尋找文件或目錄的范本樣式;
  • -true:將find指令的回傳值皆設為True;
  • -uid<用戶識別碼>:查找符合指定的用戶識別碼的文件或目錄;
  • -used<日數>:查找文件或目錄被更改之后在指定時間曾被存取過的文件或目錄,單位以日計算;
  • -user<擁有者名稱>:查找符和指定的擁有者名稱的文件或目錄;
  • -version或——version:顯示版本信息;
  • -xdev:將范圍局限在先行的文件系統中;
  • -xtype<文件類型>:此參數的效果和指定“-type”參數類似,差別在于它針對符號連接檢查。</pre>

案例

  • 案例1
    列出當前目錄及子目錄下所有文件和文件夾
find .
  • 案例2
    在/home目錄下查找以.txt結尾的文件名
find /home -name "*.txt"
  • 案例3
    同上,但忽略大小寫
find /home -iname "*.txt"
  • 案例4:
    當前目錄及子目錄下查找所有以.txt和.pdf結尾的文件
find . \( -name "*.txt" -o -name "*.pdf" \)

或

find . -name "*.txt" -o -name "*.pdf" 
  • 案例5
    匹配文件路徑或者文件
find /usr/ -path "*local*"
  • 案例6
    基于正則表達式匹配文件路徑
find . -regex ".*\(\.txt\|\.pdf\)$"
  • 案例7
    同上,但忽略大小寫
find . -iregex ".*\(\.txt\|\.pdf\)$"

否定參數

找出/home下不是以.txt結尾的文件

find /home ! -name "*.txt"

根據文件類型進行搜索

find . -type 類型參數

類型參數列表:

  • f 普通文件
  • l 符號連接
  • d 目錄
  • c 字符設備
  • b 塊設備
  • s 套接字
  • p Fifo

基于目錄深度搜索

向下最大深度限制為3

find . -maxdepth 3 -type f

搜索出深度距離當前目錄至少2個子目錄的所有文件

find . -mindepth 2 -type f

根據文件時間戳進行搜索

find . -type f 時間戳

UNIX/Linux文件系統每個文件都有三種時間戳:

  • 訪問時間(-atime/天,-amin/分鐘):用戶最近一次訪問時間。
  • 修改時間(-mtime/天,-mmin/分鐘):文件最后一次修改時間。
  • 變化時間(-ctime/天,-cmin/分鐘):文件數據元(例如權限等)最后一次修改時間。
    搜索最近七天內被訪問過的所有文件
find . -type f -atime -7

搜索恰好在七天前被訪問過的所有文件

find . -type f -atime 7

搜索訪問時間超過10分鐘的所有文件

find . -type f -amin +10

找出比file.log修改時間更長的所有文件

find . -type f -newer file.log

根據文件大小進行匹配

find . -type f -size 文件大小單元

文件大小單元:

  • b —— 塊(512字節)
  • c —— 字節
  • w —— 字(2字節)
  • k —— 千字節
  • M —— 兆字節
  • G —— 吉字節
    搜索大于10KB的文件
find . -type f -size +10k

搜索小于10KB的文件

find . -type f -size -10k

搜索等于10KB的文件

find . -type f -size 10k

刪除匹配文件

刪除當前目錄下所有.txt文件

find . -type f -name "*.txt" -delete

根據文件權限/所有權進行匹配

當前目錄下搜索出權限為777的文件

find . -type f -perm 777

找出當前目錄下權限不是644的php文件

find . -type f -name "*.php" ! -perm 644

找出當前目錄用戶tom擁有的所有文件

find . -type f -user tom

找出當前目錄用戶組sunk擁有的所有文件

find . -type f -group sunk

借助-exec選項與其他命令結合使用

找出當前目錄下所有root的文件,并把所有權更改為用戶tom

find .-type f -user root -exec chown tom {} \;

上例中,{} 用于與-exec選項結合使用來匹配所有文件,然后會被替換為相應的文件名。
找出自己家目錄下所有的.txt文件并刪除

find $HOME/. -name "*.txt" -ok rm {} \;

上例中,-ok和-exec行為一樣,不過它會給出提示,是否執行相應的操作。
查找當前目錄下所有.txt文件并把他們拼接起來寫入到all.txt文件中

find . -type f -name "*.txt" -exec cat {} \;> all.txt

將30天前的.log文件移動到old目錄中

find . -type f -mtime +30 -name "*.log" -exec cp {} old \;

找出當前目錄下所有.txt文件并以“File:文件名”的形式打印出來

find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;

因為單行命令中-exec參數中無法使用多個命令,以下方法可以實現在-exec之后接受多條命令

-exec ./text.sh {} \;

搜索但跳出指定的目錄

查找當前目錄或者子目錄下所有.txt文件,但是跳過子目錄sk

find . -path "./sk" -prune -o -name "*.txt" -print

find其他技巧收集

要列出所有長度為零的文件

find . -empty

練習題

  1. 查找/var目錄屬主為root,且屬組為mail的所有文件
  2. 查找/usr目錄下不屬于root、bin或hadoop的所有文件
  3. 查找/etc目錄下最近一周內其內容修改過,且屬主不為root或hadoop的所有文件
  4. 查找當前系統上沒有屬主或屬組,且最近一周內曾被訪問過的所有文件
  5. 查找/etc目錄下大于20K且類型為普通文件的所有文件
  6. 查找/etc目錄下所有用戶都沒有寫權限
  7. 查找/etc目錄下至少有一類用戶沒有執行權限的文件
  8. 查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶擁有寫權限的文件
find /var -user root -group mail -ls
find /var \( -user root -a -group mail \) -ls

find /usr ! \( -user root -o -user bin -o -user jason \) -exec ls -l {} \;

find /etc ! \( -user root -o -user hadoop \) -mtime -7 -exec ls -l {} \;

find / -atime -7 -a \( -nouser -o -nogroup \) -ls

find /etc -type f -size +20k -exec ls -l {} \; |head -n 10

find /etc ! -perm /222 -exec ls -l  {} \;

find /etc ! -perm -111 -exec ls -l {} \;

find /etc/init.d -perm -112 -exec ls -l {} \;

練習題

1.查找 /tmp 目錄下名字為 aming開頭的所有文件。
find /tmp -name "aming*"    #注意這里并不能使用 ^aming

2.查找指定 inode 的文件或目錄
find / -inum 141418

3.找出 tmp 目錄下的所有一級子目錄
find /tmp -maxdepth 1 -type d  
在root目錄下及其最大兩層深度的子目錄中,查找 passwd 文件
find /root -maxdepth 3 -name passwd  
在第二層和第四層子目錄之間查找 passwd 文件
find . -mindepth 3 -maxdepth 5 -name passwd

4.搜索tmp目錄下所屬組group1,所屬主user1的文件
find /tmp -type f -user user1 -group group1

5.搜索根目錄下的 1.txt 2.txt 和 a 目錄  
find / -name 1.txt -o -name 2.txt -o -type d -name a

6. 搜索tmp目錄下以 a 開頭并且以 c 結尾的文件   
find /tmp -name "a*" -a -name "*c" -type f

7. 搜索 tmp 目錄下,不是以 a 開頭,并且大小超過100M的文件  
find /tmp -not -name "a*" -a -name "*txt" -size +100M -tyep f

8. 搜索 tmp 目錄下,修改時間一年內的文件   
find . -type f  -mtime -365

9. 搜索目錄下,修改時間一年內,不是文件的其他類型   
find . -not -type f -mtime -365

10.搜索目錄下,修改時間超過一年的并且大于100M的文件   
find . -type f -not -mtime -365 -a -size +100M

11.列出tmp目錄下一年內都沒有改變的文件   
find /tmp -type f ! -mtime -365

12.找出 tmp 目錄下的所有的一級空目錄
find . -type d -empty
13.搜索tmp目錄下名稱包含*.txt的目錄,或者包含*.txt并且權限為777的文件或目錄
find /tmp -name *.txt -a /( -perm 777 -o -type d /)  #-a and意思

14.查找所有的隱藏目錄
find . -type d -name ".*"

15.搜索當前目錄下10天以前的文件,或者權限為644的的文件和目錄
find . -type f -mtime +10 -o -perm 644

16.在 / 目錄下的 etc目錄及其子目錄下查找 passwd 文件
find /etc -name passwdfind / -path -path "/etc*" -name passwd/etc/passwd/etc/pam.d/passwd 在根目錄下的 etc 以及 tmp 目錄內查找 passwd 文件cp /etc/passwd /tmpfind / /( -path "/etc*" -o -path "/tmp*" /) -name passwd
在所有名為 general 的目錄下查找 .stp 結尾的文件find / -path "*/general/*" -name "*.stp"
 找到 usr 目錄下,并且在 applications 子目錄里面以 .cache 結尾的文件。假設并不知道 applications 的絕對路徑,并且目錄是第 10 層甚至第 100 層目錄,只知道絕對路徑以 /usr/local 開頭方法一:find /usr/local -name applications -type d 在用上面找到的絕對路徑去執行 find ....... -name "*.cache"方法二: find /usr/local -path "*share*" -name "*.cache" 
NOTE: -path ".." ,表示 path 路徑里面包含指定的字符。

17.查找除 /etc 目錄及其子目錄下的,仍在根目錄的 passwd 文件
find / -path "/etc" -prune -o -name passwd -print
查找/tmp/ 目錄下所有文件(不包含目錄), 并且不包含目錄123
find /tmp/ -path "/tmp/123" -prune -o -type f -print-print -path -prune -o 固定格式,一個都不能少 ,表示排除指定的目錄或文件
查找/tmp/ 目錄下所有文件(不包含目錄), 并且不包含目錄123和目錄234和目錄345find /tmp/ /( -path "/tmp/123" -o -path "/tmp/234" -o -path "/tmp/345" /) -prune -o -type f -print注意,如果是查找目錄時,-path 后面的目錄名一定不要帶/ 如 寫成 -path "/tmp/123/" 就錯了,而查找文件時,帶/ 沒有問題。

18.刪除tmp目錄下所有文件
find /tmp/ -type f |xargs rm

19.查找類型為 ext4 的文件
find . -fstype ext4

20.查找tmp目錄下包含abcde字母的文件,不區分大小
find /tmp -iname abcde
使用find重命名文件

21.用inode 16187430 編號重命名為 newtest
find -inum 16187430 -exec mv {} new-test-file-name /;

22.給tmp目錄下的所有文件增加.bak后綴
find /tmp/ -type f |xargs -i {} {}.bak-i 
#把簽名列出的文件一個個的處理{} 表示一次一個對象,比如find出來很多行,每次處理一行,用{}代表這一行

23.找到具有組讀權限的文件和目錄
find . -perm -g=r  -exec ls -l {} /; 
#-g=r 會模糊匹配,只要含有 r 權限的都會列出來

24.找到具有組讀權限和寫權限的文件和目錄
find . -perm -g=r -a -perm -g=w -type f 

25.搜索具有用戶讀寫可執行權限的目錄
find . -perm -u=r -a -perm -u=w -a -perm -u=x -type f

26.找到對組用戶具有只讀權限的文件,
find -perm g=r -exec ls -l {} /;
#----r----- 1 root root 0 3月  31 21:50 ./1find -perm 040 -exec ls -l {} /;

27.列出/etc目錄及其子目錄下的5個最大的文件。
find /etc  -exec ls -s {} /; | sort -n -r | head -5

28.列出 /etc 目錄及其子目錄下5個最小的文件
find /etc -type f -exec ls -s {} /; | sort -n  | head -5

29.列出 /etc 目錄及其子目錄下5個最小的文件,不包含 0 空文件
find /etc -not -empty -type f -exec ls -s {} /; | sort -n  | head -5find /etc ! -empty 
-type f -exec ls -s {} /; | sort -n  | head -5

30.find 命令刪除大于100M的 .zip 文件
find / -type f -name "*.zip" -size +100M -exec rm -i {} /;

31.列出在1.txt修改之后修改的文件
find -newer 1.txt

32.列出在1.txt 和 test 之間修改的文件
find -newer 1.txt ! -newer test       #該命令列出的文件,會包含 test 文件

33.列出在 2012.12.01 到 2012.12.31 修改的文件思路,手動創建兩個文件,文件目錄無所謂,修改時間
#touch -m -t 1212010000 1.txt
#touch -m -t 1212322359 2.txt
find / -newer 1.txt ! -newer 2.txt
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數據革命閱讀 12,218評論 2 33
  • 在linux中可以使用find命令在磁盤上查找文件,功能十分強大,下面總結一些常用的用法 find的基本模式是 f...
    熙熙爸爸閱讀 899評論 0 0
  • 查詢命令 find * find [指定查找目錄] [查找規則] [查找完后執行的action]* find ~/...
    chapa閱讀 728評論 0 5
  • sina 基本命令分類簡介: 查看Linux內核版本: cat /proc/version//第一種 uname ...
    橙小汁閱讀 3,453評論 2 7
  • 每逢清明倍思親,鄉音無改鬢毛衰; 親兄姐妹同團聚,追憶雙親感恩懷。 老爸從前在村里副業隊管山時經常在這個房子里歇腳...
    五月的荷閱讀 366評論 3 3