之前客戶 server 遇到單一目錄檔案過大問題,使用 rm -f *
或者是砍掉整個目錄都遇到 arguments 過多問題,最終使用 find
指令解決,有在使用 Linux 的人一定知道 find
的強大,在這邊作把常用的案例濃縮筆記一下。
範例
一般
find . -type f -name "lebron*" # 搜尋 lebron 為首的檔案
find . -type f -iname "lebron*" # 搜尋 lebron 為首的檔案(不區分大小寫)
find . -type d -name "lebron*" # 搜尋 lebron 為首的目錄
時間類
參數 | 說明 | 單位 | 範例 | 說明 |
---|---|---|---|---|
atime |
檔案最後存取的時間 | 天 | find /path -atime -7 |
找出 7 天內被存取過的檔案 |
ctime |
檔案的 inode 最後變更時間 | 天 | find /path -ctime +30 |
找出 30 天前 inode 變更的檔案(如權限修改) |
mtime |
檔案內容的最後修改時間 | 天 | find /path -mtime 0 |
找出今天內修改過內容的檔案 |
amin |
檔案最後存取的時間 | 分鐘 | find /path -amin -60 |
找出 60 分鐘內被存取過的檔案 |
cmin |
檔案的 inode 最後變更時間 | 分鐘 | find /path -cmin +120 |
找出 120 分鐘前 inode 變更的檔案 |
mmin |
檔案內容的最後修改時間 | 分鐘 | find /path -mmin -30 |
找出 30 分鐘內修改過內容的檔案 |
-time
指令 | 查詢範圍 | 檔案舉例(假設今天是 2024/02/21) |
---|---|---|
-mtime +3 |
4 天前或更早 | ✅ 2024/02/17、✅ 2024/02/16 |
-mtime 3 |
剛好 3 天前 | ✅ 2024/02/18 |
-mtime -3 |
最近 3 天內(包含今天) | ✅ 2024/02/21、✅ 2024/02/20、✅ 2024/02/19 |
-mtime 0 |
今天(00:00 之後) | ✅ 2024/02/21(今天) |
min
指令 | 查詢範圍 | 檔案舉例(假設現在是 12:00 PM) |
---|---|---|
-mmin +30 |
31 分鐘前或更早 | ✅ 11:29 AM、✅ 11:00 AM |
-mmin 30 |
剛好 30 分鐘前 | ✅ 11:30 AM |
-mmin -30 |
最近 30 分鐘內(含現在) | ✅ 12:00 PM、✅ 11:50 AM、✅ 11:45 AM |
-mmin 0 |
最近 1 分鐘內(剛改變) | ✅ 12:00 PM |
空間類
參數 | 說明 | 單位 | 範例 | 說明 |
---|---|---|---|---|
-size |
指定檔案大小 | 512-byte blocks (預設) | find /path -size +100M |
找出大於 100MB 的檔案 |
-empty |
找出空檔案或空目錄 | N/A | find /path -empty |
找出空檔案或空目錄 |
-maxdepth |
限制搜尋深度 | N/A | find /path -maxdepth 2 -size +1G |
限制搜尋到最多 2 層目錄內,找出大於 1GB 的檔案 |
-type f |
限制搜尋結果為檔案 | N/A | find /path -type f -size -50k |
找出小於 50KB 的檔案 |
-type d |
限制搜尋結果為目錄 | N/A | find /path -type d -size +10M |
找出超過 10MB 的目錄(通常為不常見情況) |
-size
常見用法:
find /path -size +1G
→ 找出 大於 1GB 的檔案find /path -size -500k
→ 找出 小於 500KB 的檔案find /path -size 100M
→ 找出 剛好 100MB 的檔案find /path -size +100M -size -500M
→ 找出大小介於100MB ~ 500MB
之間的檔案
-size
可用單位:
c
→ bytes(例如-size +1024c
找出大於 1024 bytes 的檔案)k
→ KB(例如-size -500k
找出小於 500KB 的檔案)M
→ MB(例如-size +10M
找出大於 10MB 的檔案)G
→ GB(例如-size +1G
找出大於 1GB 的檔案)
顯示
格式 | 說明 | 範例 |
---|---|---|
%p |
檔案的完整路徑 | ./test.txt |
%f |
檔案的名稱(不包括路徑) | test.txt |
%s |
檔案的大小(以 byte 為單位) | 1024 |
%M |
檔案的權限(如 ls -l 顯示) |
-rw-r--r-- |
%u |
檔案的擁有者 | user1 |
%g |
檔案的群組 | group1 |
%T@ |
檔案的最後修改時間,Unix 時間戳 | 1592390505.000000000 |
%TY-%Tm-%Td |
檔案的修改日期(年-月-日) | 2024-02-12 |
%TH:%TM:%TS |
檔案的修改時間(時:分:秒) | 14:30:15 |
%p |
檔案的路徑 | ./folder/test.txt |
%k |
檔案的大小(以 1KB 為單位,四捨五入) | 1 |
%l |
檔案是符號連結時,顯示其指向的檔案路徑 | ./link_to_file.txt |
%c |
檔案的創建時間(僅支援某些檔案系統) | 2024-02-10 12:00:00 |
顯示檔案名稱與大小(以 KB 為單位)
find . -type f -printf "%s KB\t%p\n"
1024 KB ./file1.txt
2048 KB ./file2.log
顯示檔案的修改日期與名稱
find . -type f -printf "%TY-%Tm-%Td %p\n"
2024-02-12 ./file1.txt
2024-02-12 ./file2.log
顯示檔案權限、擁有者、群組、大小和名稱
find . -type f -printf "%M %u %g %8s %p\n"
-rw-r--r-- user1 group1 1024 ./file1.txt
-rw-r--r-- user2 group2 2048 ./file2.txt
執行類
-printf
指令 | 說明 | 範例 | 解釋 |
---|---|---|---|
-exec |
對符合條件的檔案執行指令 | find /path -type f -name "*.log" -exec rm {} \; |
刪除所有 .log 檔案 |
-exec (多個參數) |
傳遞多個參數到指令 | find /path -type f -name "*.txt" -exec mv {} /backup/ \; |
移動 .txt 檔案到 /backup/ |
-exec (多檔案批次處理) |
用 + 來一次傳遞多個檔案 |
find /path -type f -name "*.jpg" -exec ls -lh {} + |
列出 .jpg 檔案詳細資訊(批次傳遞參數) |
-execdir |
在檔案所在目錄執行指令 | find /path -type f -name "*.bak" -execdir rm {} \; |
在檔案所在目錄刪除 .bak 檔案 |
刪除所有 .log
檔案:
find /var/log -type f -name "*.log" -exec rm {} \;
批次刪除 .tmp
檔案(避免多次執行 rm
):
find /tmp -type f -name "*.tmp" -exec rm {} +
找出 .sh
檔案並修改權限:
find /scripts -type f -name "*.sh" -exec chmod +x {} \;
計算 .log
檔案總大小:
find /var/log -type f -name "*.log" -exec du -ch {} + | tail -n 1
-delete
:
指令 | 說明 | 範例 | 解釋 |
---|---|---|---|
-delete |
刪除符合條件的檔案 | find /path -type f -name "*.log" -delete |
刪除所有 .log 檔案 |
-delete (空目錄) |
刪除空目錄 | find /path -type d -empty -delete |
刪除所有空目錄 |
-delete (限制層級) |
限制搜尋深度刪除 | find /path -maxdepth 1 -type f -name "*.tmp" -delete |
只刪除 /path 下的 .tmp 檔案,不影響子目錄 |
其他
參數 | 說明 | 範例 | 解釋 |
---|---|---|---|
-user |
搜尋指定使用者擁有的檔案 | find /path -user username |
找出屬於指定使用者的檔案 |
-group |
搜尋指定群組擁有的檔案 | find /path -group groupname |
找出屬於指定群組的檔案 |
-perm |
根據檔案權限搜尋檔案 | find /path -perm 755 |
找出擁有 755 權限的檔案 |
-newer |
搜尋修改時間在指定檔案之後的檔案 | find /path -newer file1.txt |
找出在 file1.txt 之後被修改過的檔案 |
! -newer |
搜尋修改時間在指定檔案之前的檔案 | find /path ! -newer file1.txt |
找出在 file1.txt 之前被修改過的檔案 |
-maxdepth |
限制搜尋的最大目錄層級 | find /path -maxdepth 2 |
只搜尋最多 2 層目錄深度的檔案 |
-mindepth |
限制搜尋的最小目錄層級 | find /path -mindepth 2 |
只搜尋從第 2 層開始的檔案 |
-print0 |
輸出檔案名稱並以 null 字元結尾,用於處理空格 | find /path -print0 |
方便與 xargs -0 搭配使用,避免檔名有空格 |
-0 |
接受 null 字元分隔的檔案名稱 | find /path -print0 | xargs -0 rm |
用於 xargs ,確保檔名包含空格的情況下也能正確處理 |
-iname |
不區分大小寫的檔案名稱搜尋 | find /path -iname "*.jpg" |
搜尋所有 .jpg 檔案,不區分大小寫 |
-empty |
搜尋空的檔案或目錄 | find /path -empty |
找出所有空的檔案或目錄 |
-exec |
執行指定的命令來處理找到的檔案 | find /path -name "*.log" -exec ls -lh {} \; |
對每個找到的檔案執行 ls -lh |
-exec + |
批次處理所有符合條件的檔案,提高效率 | find /path -name "*.log" -exec ls -lh {} + |
批次執行命令,將多個檔案一次傳遞給命令處理 |
-prune |
排除特定目錄,使其不被搜尋 | find /path -path "/path/exclude" -prune -o -name "*.txt" -print |
排除 /path/exclude 目錄,只搜尋其他 .txt 檔案 |
-follow |
跟隨符號連結 | find /path -follow -name "*.txt" |
跟隨符號連結,搜尋 .txt 檔案 |