天天看點

linux find 指令查找檔案和檔案夾

查找目錄:find /(查找範圍) -name ‘查找關鍵字’ -type d

查找檔案:find /(查找範圍) -name 查找關鍵字 -print

詳解:

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

文法

find(選項)(參數)

選項

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

-print0:假設find指令的回傳值為ture,就将檔案或目錄名稱列出到标準輸出。格式為全部的名稱皆在同一行;

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

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

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

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

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

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

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

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

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

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

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

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

參數

起始目錄:查找檔案的起始目錄。

執行個體

根據檔案或者正規表達式進行比對

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

find .

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

find /home -name “*.txt”

同上,但忽略大小寫

find /home -iname “*.txt”

目前目錄及子目錄下查找所有以.txt和.pdf結尾的檔案

find . ( -name “.txt" -o -name ".pdf” )

find . -name “.txt" -o -name ".pdf”

比對檔案路徑或者檔案

find /usr/ -path “local”

基于正規表達式比對檔案路徑

find . -regex “.*(.txt|.pdf)$”

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

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

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

繼續閱讀