find 是 Linux 系統管理與開發自動化的核心工具。本文彙整 50+ 實戰範例,涵蓋名稱、時間、大小、權限、擁有者、類型、深度、動作執行等全維度用法,並提供參數分類速查表、輸出格式控制、現代替代工具對比,作為桌邊速查手冊。

參數分類速查表
路徑與搜尋範圍控制
| 參數 | 功能 |
| 路徑 | 搜尋起始目錄,. 當前,/ 根目錄,可多路徑 |
| -maxdepth N | 最大遞迴深度 |
| -mindepth N | 最小深度(跳過前 N-1 層) |
| -mount / -xdev | 不跨越檔案系統掛載點 |
| -follow | 追蹤符號連結 |
| -daystart | 時間以當天 00:00 為基準 |
檔案屬性測試條件
| 類別 | 參數 | 說明 |
| 名稱 | -name 模式 | 檔名匹配(區分大小寫) |
| -iname 模式 | 檔名匹配(忽略大小寫) |
| -path 模式 | 完整路徑匹配 |
| 時間 | -mtime n/-n/+n | 修改時間:正好/內/前 n 天 |
| -atime n/-n/+n | 存取時間 |
| -ctime n/-n/+n | 狀態改變時間 |
| -mmin/-amin/-cmin | 分鐘精度 |
| 大小 | -size n[c/k/M/G] | 大小:正好/+/-, 單位 c=bytes |
| -empty | 空檔案或空目錄 |
| 權限 | -perm 模式 | 精確權限匹配 |
| -perm -模式 | 至少包含該權限位 |
| -perm /模式 | 任一權限位匹配 |
| 擁有者 | -user 名稱/UID | 檔案擁有者 |
| -group 名稱/GID | 所屬群組 |
| -nouser | 無對應用戶 (UID 不在 /etc/passwd) |
| -nogroup | 無對應群組 |
| 類型 | -type f/d/l/b/c/p/s | 一般/目錄/連結/區塊/字元/FIFO/Socket |
| -xtype | 針對符號連結目標類型 |
| -links n | 硬連結數 |
邏輯運算與動作
| 類別 | 參數 | 說明 |
| 邏輯 | ( expr ) | 群組(需轉義 \( \)) |
| ! / -not expr | 邏輯非 |
| -a / -and | 邏輯與(隱性可省略) |
| -o / -or | 邏輯或(必須顯式) |
| 動作 | -print | 列印路徑(預設,換行分隔) |
| -print0 | Null 分隔(配合 xargs -0) |
| -ls | 詳細列表(ls -lids 格式) |
| -exec cmd {} \; | 每檔執行一次命令 |
| -exec cmd {} + | 批次傳遞參數執行 |
| -ok cmd {} \; | 每檔詢問確認 |
| -delete | 直接刪除(深度優先,效率最高) |
| -printf 格式 | 自訂輸出格式 |
| -fprintf 檔案 格式 | 輸出至檔案 |
| -quit | 找到第一個匹配即退出 |
50+ 實戰範例分類彙總
基礎名稱搜尋
find ~ -name "*.txt" -print # 家目錄找 .txt
find . -name "[A-Z]*" -print # 大寫開頭
find /etc -name "host*" -print # host 開頭
find . -name "[a-z][a-z][0-9][0-9].txt" -print # 兩字母兩數字
權限與擁有者
find . -perm 755 -print # 精確 755
find . -perm -007 -exec ls -l {} \; # 全域可讀寫執行 (等同 777)
find . -user cnscn -print # 屬於用戶
find . -uid +501 -print # UID > 501
find . -group cnscn -print # 屬於群組
find . -nouser -print # 無擁有者
find . -nogroup -print # 無群組
時間與大小
find /home -mtime -2 -print # 2天內修改
find /home -atime -1 -print # 1天內存取
find /home -mmin +60 -print # 60分鐘前修改
find /home -amin +30 -print # 30分鐘前存取
find /home -newer tmp.txt -print # 比 tmp.txt 新(修改時間)
find /home -anewer tmp.txt -print # 比 tmp.txt 新(存取時間)
find /home -used -2 -print # 修改後2天內被存取
find . -size +1000000c -print # > 1MB
find . -size 100c -print # = 100 bytes
find . -size +10 -print # > 10 區塊 (5120 bytes)
類型與深度
find . -type d -print # 所有目錄
find . ! -type d -print # 非目錄
find . -type l -print # 符號連結
find /home -name tmp.txt -maxdepth 4 -print # 最大深度 3 層
find /home -name tmp.txt -mindepth 3 -print # 從第 2 層開始
find /home -empty -print # 空檔/空目錄
動作執行經典模式
# 刪除 .svn 目錄
find . -name ".svn" -exec rm -rf {} \;
find . -name ".svn" -exec rm -rf {} + # 批次更快
find . -name ".svn" -delete # 最快(需支援)
# 檢查 /etc/passwd 是否存在用戶
find /etc -name "passwd*" -exec grep "cnscn" {} \;
# 批次修改權限
find . -name "yao*" | xargs chmod o-w
find . -name "yao*" -exec chmod o-w {} +
# 備份配置檔
find . -name "yao*" | xargs file
find . -name "yao*" | xargs echo "" > /tmp/core.log
# cpio 磁帶備份
cd /
find etc home apps -depth -print | cpio -ivcdC65536 -o /dev/rmt0
系統級搜尋常用單行
find / -amin -10 # 10分鐘內被存取
find / -atime -2 # 48小時內被存取
find / -empty # 空檔/空目錄
find / -group cat # 屬於群組 cat
find / -mmin -5 # 5分鐘內修改
find / -mtime -1 # 24小時內修改
find / -nouser # 無擁有者
find / -user fred # 屬於用戶 fred
輸出格式控制:-printf 進階用法
# 格式化輸出:路徑 大小 修改時間 權限 擁有者
find . -type f -printf "%p %s %TY-%Tm-%Td %TH:%TM %M %u\n"
# 常用格式符
%p 路徑 %f 檔名 %h 目錄部分
%s 大小bytes %k 大小KiB %b 區塊數
%T@ 時間戳 %TY-%Tm-%Td 年-月-日 %TH:%TM 時:分
%M 權限符號 %m 權限八進制 %u 擁有者名 %g 群組名
%i inode %l 連結目標 %n 硬連結數
現代替代工具快速對比
| 工具 | 定位 | 核心優勢 | 適用場景 |
| find | 檔案屬性搜尋 | 系統預裝、功能最全、腳本標準 | 自動化腳本、系統管理、複雜邏輯 |
| fd | 檔案名搜尋 | 預設忽略 .gitignore、平行、彩色、語法簡潔 | 互動式開發、專案內快速定位 |
| ripgrep (rg) | 檔案內容搜尋 | 極速、支援 .gitignore、正則豐富、編碼自動偵測 | 程式碼搜尋、日誌分析、內容檢索 |
| locate/plocate | 檔案名快速定位 | 資料庫索引、毫秒級、需 updatedb 更新 | 全系統檔名查詢、非即時需求 |
效能優化黃金法則
- 優先縮小路徑範圍:
find /var/log 優於 find /
- 加上 -mount: 避免掃描 /proc /sys /run 網路掛載
- 用 -maxdepth 限制深度: 避免深層遞迴
- 批次動作用 -exec + 或 -delete: 避免 -exec \; 啟動大量進程
xargs -P 平行處理: find . -name "*.log" -print0 | xargs -0 -P4 gzip
將本文作為 find 指令的桌邊速查手冊,遇到搜尋需求先查參數表、再找相似範例改造。熟練掌握「測試條件→邏輯組合→動作執行」三段式思維,配合現代工具 fd/rg 分工協作,能將檔案搜尋效率提升數個數量級。