find 搜尋時需排除特定子目錄(如 /proc、/sys、備份目錄),關鍵在 -prune 參數與邏輯組合。本文詳解單/多目錄排除、檔名過濾與內容搜尋組合。
find 搜尋路徑 -path "排除路徑" -prune -o 條件 -print
關鍵規則:-path 必須緊跟在搜尋路徑之後,否則不生效。
# 找 /home/zth 下所有檔案,排除 /home/zth/astetc
find /home/zth -path "/home/zth/astetc" -prune -o -type f -print
# 按檔名過濾
find /home/zth -path "/home/zth/astetc" -prune -o -type f -name "cdr_*.conf" -print
find /home/zth \( -path "/home/zth/astetc" -o -path "/home/zth/etc" \) -prune -o -type f -print
find /home/zth \( -path "/home/zth/astetc" -o -path "/home/zth/etc" \) -prune -o -type f -name "cdr_*.conf" -print
注意:\( \) 前後需有空格,shell 需轉義或用引號包裹。
find . -name "mysql*" -print0 | xargs -0 grep "SELECT lead_id FROM vicidial_list where vendor_lead_code"
find . -name "mysql*" | xargs grep "SELECT lead_id FROM vicidial_list where vendor_lead_code"
-print0 + xargs -0 以 null 字元分隔,完美處理特殊字元檔名。
-prune 位置錯誤 → 排除失效-o 邏輯或 → 後續條件不執行xargs 不加 -0 → 空格檔名斷裂# 排除目錄 A、B,找所有檔案
find /path \( -path "/path/A" -o -path "/path/B" \) -prune -o -type f -print
# 排除目錄,按名稱找檔
find /path \( -path "/path/A" -o -path "/path/B" \) -prune -o -type f -name "pattern" -print
# 排除目錄,搜尋內容
find /path \( -path "/path/A" -o -path "/path/B" \) -prune -o -type f -name "*.log" -print0 | xargs -0 grep "keyword"
熟練 -prune 組合拳,能精準鎖定搜尋範圍,避免掃描無關目錄浪費時間。