Linux命令 find - 在指定目錄下查找文件

2021-11-10 10:33 更新

find

在指定目錄下查找文件

補(bǔ)充說(shuō)明

find命令 用來(lái)在指定目錄下查找文件。任何位于參數(shù)之前的字符串都將被視為欲查找的目錄名。如果使用該命令時(shí),不設(shè)置任何參數(shù),則find命令將在當(dāng)前目錄下查找子目錄與文件。并且將查找到的子目錄和文件全部進(jìn)行顯示。

語(yǔ)法

find(選項(xiàng))(參數(shù))

選項(xiàng)

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

參數(shù)

起始目錄:查找文件的起始目錄。

實(shí)例

# 當(dāng)前目錄搜索所有文件,文件內(nèi)容 包含 “140.206.111.111” 的內(nèi)容
find . -type f -name "*" | xargs grep "140.206.111.111"

根據(jù)文件或者正則表達(dá)式進(jìn)行匹配

列出當(dāng)前目錄及子目錄下所有文件和文件夾

find .

在/home目錄下查找以.txt結(jié)尾的文件名

find /home -name "*.txt"

同上,但忽略大小寫

find /home -iname "*.txt"

當(dāng)前目錄及子目錄下查找所有以.txt和.pdf結(jié)尾的文件

find . \( -name "*.txt" -o -name "*.pdf" \)

或

find . -name "*.txt" -o -name "*.pdf"

匹配文件路徑或者文件

find /usr/ -path "*local*"

基于正則表達(dá)式匹配文件路徑

find . -regex ".*\(\.txt\|\.pdf\)$"

同上,但忽略大小寫

find . -iregex ".*\(\.txt\|\.pdf\)$"

否定參數(shù)

找出/home下不是以.txt結(jié)尾的文件

find /home ! -name "*.txt"

根據(jù)文件類型進(jìn)行搜索

find . -type 類型參數(shù)

類型參數(shù)列表:

  • f 普通文件
  • l 符號(hào)連接
  • d 目錄
  • c 字符設(shè)備
  • b 塊設(shè)備
  • s 套接字
  • p Fifo

基于目錄深度搜索

向下最大深度限制為3

find . -maxdepth 3 -type f

搜索出深度距離當(dāng)前目錄至少2個(gè)子目錄的所有文件

find . -mindepth 2 -type f

根據(jù)文件時(shí)間戳進(jìn)行搜索

find . -type f 時(shí)間戳

UNIX/Linux文件系統(tǒng)每個(gè)文件都有三種時(shí)間戳:

  • 訪問(wèn)時(shí)間 (-atime/天,-amin/分鐘):用戶最近一次訪問(wèn)時(shí)間。
  • 修改時(shí)間 (-mtime/天,-mmin/分鐘):文件最后一次修改時(shí)間。
  • 變化時(shí)間 (-ctime/天,-cmin/分鐘):文件數(shù)據(jù)元(例如權(quán)限等)最后一次修改時(shí)間。

搜索最近七天內(nèi)被訪問(wèn)過(guò)的所有文件

find . -type f -atime -7

搜索恰好在七天前被訪問(wèn)過(guò)的所有文件

find . -type f -atime 7

搜索超過(guò)七天內(nèi)被訪問(wèn)過(guò)的所有文件

find . -type f -atime +7

搜索訪問(wèn)時(shí)間超過(guò)10分鐘的所有文件

find . -type f -amin +10

找出比f(wàn)ile.log修改時(shí)間更長(zhǎng)的所有文件

find . -type f -newer file.log

根據(jù)文件大小進(jìn)行匹配

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

文件大小單元:

  • b —— 塊(512字節(jié))
  • c —— 字節(jié)
  • w —— 字(2字節(jié))
  • k —— 千字節(jié)
  • M —— 兆字節(jié)
  • G —— 吉字節(jié)

搜索大于10KB的文件

find . -type f -size +10k

搜索小于10KB的文件

find . -type f -size -10k

搜索等于10KB的文件

find . -type f -size 10k

刪除匹配文件

刪除當(dāng)前目錄下所有.txt文件

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

根據(jù)文件權(quán)限/所有權(quán)進(jìn)行匹配

當(dāng)前目錄下搜索出權(quán)限為777的文件

find . -type f -perm 777

找出當(dāng)前目錄下權(quán)限不是644的php文件

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

找出當(dāng)前目錄用戶tom擁有的所有文件

find . -type f -user tom

找出當(dāng)前目錄用戶組sunk擁有的所有文件

find . -type f -group sunk

借助-exec選項(xiàng)與其他命令結(jié)合使用

找出當(dāng)前目錄下所有root的文件,并把所有權(quán)更改為用戶tom

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

上例中, {} 用于與 -exec 選項(xiàng)結(jié)合使用來(lái)匹配所有文件,然后會(huì)被替換為相應(yīng)的文件名。

找出自己家目錄下所有的.txt文件并刪除

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

上例中, -ok 和 -exec 行為一樣,不過(guò)它會(huì)給出提示,是否執(zhí)行相應(yīng)的操作。

查找當(dāng)前目錄下所有.txt文件并把他們拼接起來(lái)寫入到all.txt文件中

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

將30天前的.log文件移動(dòng)到old目錄中

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

找出當(dāng)前目錄下所有.txt文件并以“File:文件名”的形式打印出來(lái)

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

因?yàn)閱涡忻钪?exec參數(shù)中無(wú)法使用多個(gè)命令,以下方法可以實(shí)現(xiàn)在-exec之后接受多條命令

-exec ./text.sh {} \;

搜索但跳過(guò)指定的目錄

查找當(dāng)前目錄或者子目錄下所有.txt文件,但是跳過(guò)子目錄sk

find . -path "./sk" -prune -o -name "*.txt" -print
?? ./sk 不能寫成 ./sk/ ,否則沒(méi)有作用。

忽略兩個(gè)目錄

find . \( -path ./sk -o  -path ./st \) -prune -o -name "*.txt" -print
?? 如果寫相對(duì)路徑必須加上./

find其他技巧收集

要列出所有長(zhǎng)度為零的文件

find . -empty

其它實(shí)例

find ~ -name '*jpg' # 主目錄中找到所有的 jpg 文件。 -name 參數(shù)允許你將結(jié)果限制為與給定模式匹配的文件。
find ~ -iname '*jpg' # -iname 就像 -name,但是不區(qū)分大小寫
find ~ ( -iname 'jpeg' -o -iname 'jpg' ) # 一些圖片可能是 .jpeg 擴(kuò)展名。幸運(yùn)的是,我們可以將模式用“或”(表示為 -o)來(lái)組合。
find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f # 如果你有一些以 jpg 結(jié)尾的目錄呢? (為什么你要命名一個(gè) bucketofjpg 而不是 pictures 的目錄就超出了本文的范圍。)我們使用 -type 參數(shù)修改我們的命令來(lái)查找文件。
find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type d # 也許你想找到那些命名奇怪的目錄,以便稍后重命名它們

最近拍了很多照片,所以讓我們把它縮小到上周更改的文件

find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7

你可以根據(jù)文件狀態(tài)更改時(shí)間 (ctime)、修改時(shí)間 (mtime) 或訪問(wèn)時(shí)間 (atime) 來(lái)執(zhí)行時(shí)間過(guò)濾。 這些是在幾天內(nèi),所以如果你想要更細(xì)粒度的控制,你可以表示為在幾分鐘內(nèi)(分別是 cmin、mmin 和 amin)。 除非你確切地知道你想要的時(shí)間,否則你可能會(huì)在 + (大于)或 - (小于)的后面加上數(shù)字。

但也許你不關(guān)心你的照片。也許你的磁盤空間不夠用,所以你想在 log 目錄下找到所有巨大的(讓我們定義為“大于 1GB”)文件:

find /var/log -size +1G

或者,也許你想在 /data 中找到 bcotton 擁有的所有文件:

find /data -owner bcotton

你還可以根據(jù)權(quán)限查找文件。也許你想在你的主目錄中找到對(duì)所有人可讀的文件,以確保你不會(huì)過(guò)度分享。

find ~ -perm -o=r

刪除 mac 下自動(dòng)生成的文件

find ./ -name '__MACOSX' -depth -exec rm -rf {} \;

統(tǒng)計(jì)代碼行數(shù)

find . -name "*.java"|xargs cat|grep -v ^$|wc -l # 代碼行數(shù)統(tǒng)計(jì), 排除空行


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)