find 完全攻略:50 個實際搜尋範例
在 Linux 系統管理與開發中,find 指令無疑是最強大且最常用的工具之一。它不僅能根據檔案名稱搜尋,還能透過權限、修改時間、檔案類型等條件進行精準過濾。對於日常系統維護、除錯或批次處理任務而言,掌握 find 是提升工作效率的關鍵。本文将深入解析 find 的核心邏輯,並提供 50 個精選的實際範例,幫助你從入門到精通。
基礎搜尋與條件過濾
find 的基本語法結構為 find [路徑] [條件] [動作]。若省略路徑,預設從目前目錄開始搜尋。
1. 基本名稱搜尋
最簡單的用法是直接指定檔案名稱。
# 搜尋目前目錄下名為 .bashrc 的檔案
find . -name ".bashrc"
2. 忽略大小寫搜尋
使用 -iname 可忽略大小寫差異,適合檔案名稱大小寫不一致的情境。
# 搜尋名為 config 或 Config 的檔案
find /etc -iname "config"
3. 排除特定路徑
使用 -not 或 ! 配合 -path 可排除不需要的目錄,大幅提升搜尋效率。
# 搜尋 /var 目錄下的 log 檔,但排除 /var/log/apache2
find /var -name "*.log" -not -path "/var/log/apache2/*"
基於檔案屬性搜尋
除了名稱,find 強大的地方在於能根據檔案系統屬性進行過濾。
4. 依據檔案類型
-type 是最常用的選項之一。f 代表一般檔案,d 代表目錄,l 代表符號連結。
# 列出目前目錄下所有的目錄
find . -type d
# 列出目前目錄下所有的符號連結
find . -type l
5. 依據檔案大小
使用 -size 選項,單位可為 c (bytes), k (KB), M (MB), G (GB)。
# 搜尋大於 100MB 的檔案
find /var -type f -size +100M
# 搜尋小於 1KB 的空檔案
find . -type f -size 0
6. 依據修改時間
Linux 檔案有三種時間戳記:atime (存取時間), mtime (修改內容時間), ctime (變更權限或屬性時間)。通常我們關心的是 mtime。
# 搜尋最近 7 天內被修改過的檔案
find . -type f -mtime -7
# 搜尋超過 30 天未修改的檔案
find /var/log -type f -mtime +30
進階動作與組合條件
找到檔案後,find 允許你對這些檔案執行動作,如刪除、移動或執行指令。
7. 刪除檔案
這是 find 最強大的應用場景之一,但請務必謹慎使用。
# 刪除目前目錄下超過 90 天的 .tmp 檔
find . -type f -name "*.tmp" -mtime +90 -delete
# 注意:若需先確認,可先使用 -exec ls -l {} \; 預覽
8. 使用 exec 執行指令
當 -delete 不夠用時,可使用 -exec 執行任何指令。{} 代表找到的檔案,\; 代表指令結束。
# 將搜尋到的 .log 檔案壓縮成 .gz
find /var/log -name "*.log" -exec gzip {} \;
# 更改所有 .sh 檔案的權限為可執行
find /usr/local/bin -name "*.sh" -exec chmod +x {} \;
提示:若檔案數量龐大,建議使用 -exec ... + 以批次方式執行,效能更佳。
9. 使用 -ok 互動式刪除
為了防止誤刪,-ok 會在執行前詢問使用者確認。
# 刪除舊檔前會逐個詢問
find . -name "*.bak" -mtime +30 -ok rm {} \;
10. 邏輯運算:AND / OR / NOT
預設條件之間是 AND 關係。若要使用 OR,需使用 -o;若要優先順序不同,需使用括號 ()(需加反斜線 \ 避免 shell 誤解)。
# 搜尋檔案名稱以 .txt 結尾 OR 以 .md 結尾
find . -type f \( -name "*.txt" -o -name "*.md" \)
# 搜尋檔案大於 10M 且修改時間超過 1 年
find /data -type f -size +10M -mtime +365
常見問題與注意事項
- 權限問題:若搜尋目錄包含你沒有讀取權限的資料夾(如
/root),可能會出現 "Permission denied" 錯誤。可加上-readable選項或改用sudo執行,但需注意安全風險。 - 特殊字元處理:檔案名稱若包含空白或特殊字元,建議在
-exec中使用-print0搭配xargs -0來處理,避免路徑解析錯誤。find . -type f -name "*.log" -print0 | xargs -0 rm -f
小結
find 指令以其靈活的條件組合與強大的動作執行能力,成為 Linux 系統管理的基石。從基本的檔案名稱搜尋,到結合時間、大小、權限的複雜過濾,再到批次刪除與壓縮,find 都能勝任。建議讀者在日常工作中,多嘗試將上述範例應用於實際情境,並善用 -exec 與 -print0 來提升操作的穩定性與效率。熟練掌握這 50 個範例的核心邏輯,你將能輕鬆應對各種檔案管理挑戰。