天天看點

Linux學習筆記——find指令

描述:find指令用來在指定目錄下查找檔案。任何位于參數之前的字元串都将被視為欲查找的目錄名。如果使用該指令時,不設定任何參數,則find指令将在目前目錄下查找子目錄與檔案。并且将查找到的子目錄和檔案全部進行顯示。

文法:find(選項)(參數)

常用選項:

-amin<分鐘>:           查找在指定時間曾被存取過的檔案或目錄,機關以分鐘計算; 

-anewer<參考檔案或目錄>:   查找其存取時間較指定檔案或目錄的存取時間更接近現在的檔案或目錄;

-atime<24小時數>:        查找在指定時間曾被存取過的檔案或目錄,機關以24小時計算; 

-cmin<分鐘>:           查找在指定時間之時被更改過的檔案或目錄; 

-cnewer<參考檔案或目錄>:   查找其更改時間較指定檔案或目錄的更改時間更接近現在的檔案或目錄; 

-ctime<24小時數>:        查找在指定時間之時被更改的檔案或目錄,機關以24小時計算; 

-daystart:            從本日開始計算時間; 

-depth:              從指定目錄下最深層的子目錄開始查找; 

-expty:              尋找檔案大小為0位元組的檔案,或目錄下沒有任何子目錄或檔案的空目錄; 

-exec<執行指令>:        假設find指令的回傳值為True,就執行該指令; 

-false:              将find指令的回傳值皆設為False; 

-fls<清單檔案>:         此參數的效果和指定“-ls”參數類似,但會把結果儲存為指定的清單檔案; 

-follow:              排除符号連接配接; 

-fprint<清單檔案>:      此參數的效果和指定“-print”參數類似,但會把結果儲存成指定的清單檔案; 

-fprint0<清單檔案>:      此參數的效果和指定“-print0”參數類似,但會把結果儲存成指定的清單檔案; 

-fprintf<清單檔案><輸出格式>:此參數的效果和指定“-printf”參數類似,但會把結果儲存成指定的清單檔案;

-printf<輸出格式>: 假設find指令的回傳值為Ture,就将檔案或目錄名稱列出到标準輸出。格式可以自行指定;  

-fstype<檔案系統類型>:    隻尋找該檔案系統類型下的檔案或目錄; 

-gid<群組識别碼>:        查找符合指定之群組識别碼的檔案或目錄; 

-group<群組名稱>:        查找符合指定之群組名稱的檔案或目錄; 

-help或--help:         線上幫助; 

-ilname<範本樣式>:       此參數的效果和指定“-lname”參數類似,但忽略字元大小寫的差别; 

-iname<範本樣式>:        此參數的效果和指定“-name”參數類似,但忽略字元大小寫的差别; 

-inum:               查找符合指定的inode編号的檔案或目錄; 

-path<範本樣式>:         指定字元串作為尋找目錄的範本樣式; 

-ipath<範本樣式>:        此參數的效果和指定“-path”參數類似,但忽略字元大小寫的差别;

-regex<範本樣式>:       指定字元串作為尋找檔案或目錄的範本樣式;  

-iregex<範本樣式>:       此參數的效果和指定“-regexe”參數類似,但忽略字元大小寫的差别; 

-links<連接配接數目>:        查找符合指定的硬連接配接數目的檔案或目錄; 

-iname<範本樣式>:        指定字元串作為尋找符号連接配接的範本樣式; 

-ls:                假設find指令的回傳值為Ture,就将檔案或目錄名稱列出到标準輸出; 

-maxdepth<目錄層級>:      設定最大目錄層級; 

-mindepth<目錄層級>:      設定最小目錄層級; 

-mmin<分鐘>:            查找在指定時間曾被更改過的檔案或目錄,機關以分鐘計算; 

-mount:              此參數的效果和指定“-xdev”相同; 

-mtime<24小時數>:        查找在指定時間曾被更改過的檔案或目錄,機關以24小時計算; 

-name<範本樣式>:         指定字元串作為尋找檔案或目錄的範本樣式; 

-newer<參考檔案或目錄>:    查找其更改時間較指定檔案或目錄的更改時間更接近現在的檔案或目錄; 

-nogroup:             找出不屬于本地主機群組識别碼的檔案或目錄; 

-noleaf:              不去考慮目錄至少需擁有兩個硬連接配接存在; 

-nouser:              找出不屬于本地主機使用者識别碼的檔案或目錄; 

-ok<執行指令>:          此參數的效果和指定“-exec”類似,但在執行指令之前會先詢問使用者,若回答“y”或“Y”,則放棄執行指令; 

-perm<權限數值>:        查找符合指定的權限數值的檔案或目錄; 

-print:              假設find指令的回傳值為Ture,就将檔案或目錄名稱列出到标準輸出。格式為每列一個名稱,每個名稱前皆有“./”字元串; -print0:假設find指令的回傳值為Ture,就将檔案或目錄名稱列出到标準輸出。格式為全部的名稱皆在同一行; 

-prune:              不尋找字元串作為尋找檔案或目錄的範本樣式; 

-編号>size<檔案大小>:     查找符合指定的檔案大小的檔案; 

-true:               将find指令的回傳值皆設為True; 

-typ<檔案類型>:         隻尋找符合指定的檔案類型的檔案; 

-uid<使用者識别碼>:        查找符合指定的使用者識别碼的檔案或目錄; 

-used<日數>:           查找檔案或目錄被更改之後在指定時間曾被存取過的檔案或目錄,機關以日計算; 

-user<擁有者名稱>:       查找符和指定的擁有者名稱的檔案或目錄; 

-version或--version:    顯示版本資訊; 

-xdev:               将範圍局限在先行的檔案系統中; 

-xtype<檔案類型>:        此參數的效果和指定“-type”參數類似,差别在于它針對符号連接配接檢查。

用法舉例:

1.列出目前目錄及子目錄下所有檔案和檔案夾

find .

2.在/home目錄下查找以.txt結尾的檔案名

find  /home -name "*.txt"   

find  /home -iname "*.txt"(忽略大小寫)

3.找出/home下不是以.txt結尾的檔案 

find /home ! -name "*.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\)$" 

find . -iregex ".*\(\.txt\|\.pdf\)$"(忽略大小寫)

7.根據檔案類型進行搜尋

find . -type 類型參數(f 普通檔案、 l 符号連接配接、 d 目錄、 c 字元裝置、 b 塊裝置、 s 套接字、 p Fifo)

8.基于目錄的深度查詢

向下最大深度限制為3 

find . -maxdepth 3 -type f 

搜尋出深度距離目前目錄至少2個子目錄的所有檔案 

find . -mindepth 2 -type f

9.根據檔案時間戳進行搜尋 

find . -type f 時間戳(通路時間(-atime/天,-amin/分鐘):使用者最近一次通路時間;修改時間(-mtime/天,-mmin/分鐘):檔案最後一次修改時間;變化時間(-ctime/天,-cmin/分鐘):檔案資料元(例如權限等)最後一次修改時間;)

(1)搜尋最近七天内被通路過的所有檔案 

find . -type f -atime -7 

(2)搜尋恰好在七天前被通路過的所有檔案 

find . -type f -atime 7 

(3)搜尋超過七天内被通路過的所有檔案 

find . -type f -atime +7 

(4)搜尋通路時間超過10分鐘的所有檔案 

find . -type f -amin +10 

(5)找出比file.log修改時間更長的所有檔案 

find . -type f -newer file.log

10.根據檔案大小進行比對 

find . -type f -size 檔案大小單元(b — 塊<512位元組>、c — 位元組 、w — 字(2位元組)、k — 千位元組、M — 兆位元組、G — 吉位元組)

(1)搜尋大于10KB的檔案 

find . -type f -size +10k 

(2)搜尋小于10KB的檔案 

find . -type f -size -10k 

(3)搜尋等于10KB的檔案 

find . -type f -size 10k

11.删除目前目錄下所有.txt檔案 

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

12.根據檔案權限或所有權進行比對

(1)目前目錄下搜尋出權限為777的檔案 

find . -type f -perm 777 

(2)找出目前目錄下權限不是644的php檔案 

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

(3)找出目前目錄使用者user1擁有的所有檔案 

find . -type f -user user1

(4)找出目前目錄使用者組grp1擁有的所有檔案 

find . -type f -group grp1

13.借助-exec選項與其他指令結合使用

(1)找出目前目錄下所有root的檔案,并把所有權更改為使用者user1

find .-type f -user root -exec chown user1{} \;({} 用于與-exec選項結合使用來比對所有檔案,然後會被替換為相應的檔案名)

(2)找出自己家目錄下所有的.txt檔案并删除 

find $HOME/. -name "*.txt" -ok rm {} \; (-ok和-exec行為一樣,不過它會給出提示,是否執行相應的操作)

(3)查找目前目錄下所有.txt檔案并把他們拼接起來寫入到all.txt檔案中 

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

(4)将30天前的.log檔案移動到old目錄中 

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

(5)找出目前目錄下所有.txt檔案并以“File:檔案名”的形式列印出來 

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

(6)因為單行指令中-exec參數中無法使用多個指令,以下方法可以實作在-exec之後接受多條指令 

-exec ./text.sh {} \;

14.查找目前目錄或者子目錄下所有.txt檔案,但是跳過子目錄sk 

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

15.要列出所有長度為零的檔案 

繼續閱讀