find

在指定目錄下查找文件

補充說明

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

語法

1find(選項)(參數)

選項

 1-amin<分鐘>:查找在指定時間曾被存取過的文件或目錄,單位以分鐘計算;
 2-anewer<參考文件或目錄>:查找其存取時間較指定文件或目錄的存取時間更接近現在的文件或目錄;
 3-atime<24小時數>:查找在指定時間曾被存取過的文件或目錄,單位以24小時計算;
 4-cmin<分鐘>:查找在指定時間之時被更改過的文件或目錄;
 5-cnewer<參考文件或目錄>查找其更改時間較指定文件或目錄的更改時間更接近現在的文件或目錄;
 6-ctime<24小時數>:查找在指定時間之時被更改的文件或目錄,單位以24小時計算;
 7-daystart:從本日開始計算時間;
 8-depth:從指定目錄下最深層的子目錄開始查找;
 9-empty:尋找文件大小爲0 Byte的文件,或目錄下沒有任何子目錄或文件的空目錄;
10-exec<執行指令>:假設find指令的回傳值爲True,就執行該指令;
11-false:將find指令的回傳值皆設爲False;
12-fls<列表文件>:此參數的效果和指定“-ls”參數類似,但會把結果保存爲指定的列表文件;
13-follow:排除符號連接;
14-fprint<列表文件>:此參數的效果和指定“-print”參數類似,但會把結果保存成指定的列表文件;
15-fprint0<列表文件>:此參數的效果和指定“-print0”參數類似,但會把結果保存成指定的列表文件;
16-fprintf<列表文件><輸出格式>:此參數的效果和指定“-printf”參數類似,但會把結果保存成指定的列表文件;
17-fstype<文件系統類型>:只尋找該文件系統類型下的文件或目錄;
18-gid<羣組識別碼>:查找符合指定之羣組識別碼的文件或目錄;
19-group<羣組名稱>:查找符合指定之羣組名稱的文件或目錄;
20-help或--help:在線幫助;
21-ilname<範本樣式>:此參數的效果和指定“-lname”參數類似,但忽略字符大小寫的差別;
22-iname<範本樣式>:此參數的效果和指定“-name”參數類似,但忽略字符大小寫的差別;
23-inum<inode編號>:查找符合指定的inode編號的文件或目錄;
24-ipath<範本樣式>:此參數的效果和指定“-path”參數類似,但忽略字符大小寫的差別;
25-iregex<範本樣式>:此參數的效果和指定“-regexe”參數類似,但忽略字符大小寫的差別;
26-links<連接數目>:查找符合指定的硬連接數目的文件或目錄;
27-lname<範本樣式>:指定字符串作爲尋找符號連接的範本樣式;
28-ls:假設find指令的回傳值爲True,就將文件或目錄名稱列出到標準輸出;
29-maxdepth<目錄層級>:設置最大目錄層級;
30-mindepth<目錄層級>:設置最小目錄層級;
31-mmin<分鐘>:查找在指定時間曾被更改過的文件或目錄,單位以分鐘計算;
32-mount:此參數的效果和指定“-xdev”相同;
33-mtime<24小時數>:查找在指定時間曾被更改過的文件或目錄,單位以24小時計算;
34-name<範本樣式>:指定字符串作爲尋找文件或目錄的範本樣式;
35-newer<參考文件或目錄>:查找其更改時間較指定文件或目錄的更改時間更接近現在的文件或目錄;
36-nogroup:找出不屬於本地主機羣組識別碼的文件或目錄;
37-noleaf:不去考慮目錄至少需擁有兩個硬連接存在;
38-nouser:找出不屬於本地主機用戶識別碼的文件或目錄;
39-ok<執行指令>:此參數的效果和指定“-exec”類似,但在執行指令之前會先詢問用戶,若回答“y”或“Y”,則放棄執行命令;
40-path<範本樣式>:指定字符串作爲尋找目錄的範本樣式;
41-perm<權限數值>:查找符合指定的權限數值的文件或目錄;
42-print:假設find指令的回傳值爲True,就將文件或目錄名稱列出到標準輸出。格式爲每列一個名稱,每個名稱前皆有“./”字符串;
43-print0:假設find指令的回傳值爲True,就將文件或目錄名稱列出到標準輸出。格式爲全部的名稱皆在同一行;
44-printf<輸出格式>:假設find指令的回傳值爲True,就將文件或目錄名稱列出到標準輸出。格式可以自行指定;
45-prune:不尋找字符串作爲尋找文件或目錄的範本樣式;
46-regex<範本樣式>:指定字符串作爲尋找文件或目錄的範本樣式;
47-size<文件大小>:查找符合指定的文件大小的文件;
48-true:將find指令的回傳值皆設爲True;
49-type<文件類型>:只尋找符合指定的文件類型的文件;
50-uid<用戶識別碼>:查找符合指定的用戶識別碼的文件或目錄;
51-used<日數>:查找文件或目錄被更改之後在指定時間曾被存取過的文件或目錄,單位以日計算;
52-user<擁有者名稱>:查找符和指定的擁有者名稱的文件或目錄;
53-version或——version:顯示版本信息;
54-xdev:將範圍侷限在先行的文件系統中;
55-xtype<文件類型>:此參數的效果和指定“-type”參數類似,差別在於它針對符號連接檢查。

參數

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

實例

1# 當前目錄搜索所有文件,文件內容 包含 “140.206.111.111” 的內容
2find . -type f -name "*" | xargs grep "140.206.111.111"

根據文件或者正則表達式進行匹配

列出當前目錄及子目錄下所有文件和文件夾

1find .

/home目錄下查找以.txt結尾的文件名

1find /home -name "*.txt"

同上,但忽略大小寫

1find /home -iname "*.txt"

當前目錄及子目錄下查找所有以.txt和.pdf結尾的文件

1find . \( -name "*.txt" -o -name "*.pdf" \)
2
34
5find . -name "*.txt" -o -name "*.pdf"

匹配文件路徑或者文件

1find /usr/ -path "*local*"

基於正則表達式匹配文件路徑

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

同上,但忽略大小寫

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

否定參數

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

1find /home ! -name "*.txt"

根據文件類型進行搜索

1find . -type 類型參數

類型參數列表:

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

基於目錄深度搜索

向下最大深度限制爲3

1find . -maxdepth 3 -type f

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

1find . -mindepth 2 -type f

根據文件時間戳進行搜索

1find . -type f 時間戳

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

  • 訪問時間 (-atime/天,-amin/分鐘):用戶最近一次訪問時間。
  • 修改時間 (-mtime/天,-mmin/分鐘):文件最後一次修改時間。
  • 變化時間 (-ctime/天,-cmin/分鐘):文件數據元(例如權限等)最後一次修改時間。

搜索最近七天內被訪問過的所有文件

1find . -type f -atime -7

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

1find . -type f -atime 7

搜索超過七天內被訪問過的所有文件

1find . -type f -atime +7

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

1find . -type f -amin +10

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

1find . -type f -newer file.log

根據文件大小進行匹配

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

文件大小單元:

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

搜索大於10KB的文件

1find . -type f -size +10k

搜索小於10KB的文件

1find . -type f -size -10k

搜索等於10KB的文件

1find . -type f -size 10k

刪除匹配文件

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

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

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

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

1find . -type f -perm 777

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

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

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

1find . -type f -user tom

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

1find . -type f -group sunk

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

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

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

上例中, {} 用於與 -exec 選項結合使用來匹配所有文件,然後會被替換爲相應的文件名。

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

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

上例中, -ok-exec 行爲一樣,不過它會給出提示,是否執行相應的操作。

查找當前目錄下所有.txt文件並把他們拼接起來寫入到all.txt文件中

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

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

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

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

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

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

1-exec ./text.sh {} \;

搜索但跳過指定的目錄

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

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

:warning: ./sk 不能寫成 ./sk/ ,否則沒有作用。

忽略兩個目錄

1find . \( -path ./sk -o  -path ./st \) -prune -o -name "*.txt" -print

:warning: 如果寫相對路徑必須加上./

find其他技巧收集

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

1find . -empty

其它實例

1find ~ -name '*jpg' # 主目錄中找到所有的 jpg 文件。 -name 參數允許你將結果限制爲與給定模式匹配的文件。
2find ~ -iname '*jpg' # -iname 就像 -name,但是不區分大小寫
3find ~ ( -iname 'jpeg' -o -iname 'jpg' ) # 一些圖片可能是 .jpeg 擴展名。幸運的是,我們可以將模式用“或”(表示爲 -o)來組合。
4find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f # 如果你有一些以 jpg 結尾的目錄呢? (爲什麼你要命名一個 bucketofjpg 而不是 pictures 的目錄就超出了本文的範圍。)我們使用 -type 參數修改我們的命令來查找文件。
5find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type d # 也許你想找到那些命名奇怪的目錄,以便稍後重命名它們

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

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

你可以根據文件狀態更改時間 (ctime)、修改時間 (mtime) 或訪問時間 (atime) 來執行時間過濾。 這些是在幾天內,所以如果你想要更細粒度的控制,你可以表示爲在幾分鐘內(分別是 cmin、mmin 和 amin)。 除非你確切地知道你想要的時間,否則你可能會在 + (大於)或 - (小於)的後面加上數字。

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

1find /var/log -size +1G

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

1find /data -owner bcotton

你還可以根據權限查找文件。也許你想在你的主目錄中找到對所有人可讀的文件,以確保你不會過度分享。

1find ~ -perm -o=r

刪除 mac 下自動生成的文件

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

統計代碼行數

1find . -name "*.java"|xargs cat|grep -v ^$|wc -l # 代碼行數統計, 排除空行

來源:https://github.com/jaywcjlove/linux-command

最後修改於: Wednesday, January 31, 2024

相關文章:

翻譯: