find 完全攻略:50 個實際搜尋範例 文章首圖

find 完全攻略:50 個實際搜尋範例

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

常見問題與注意事項

  1. 權限問題:若搜尋目錄包含你沒有讀取權限的資料夾(如 /root),可能會出現 "Permission denied" 錯誤。可加上 -readable 選項或改用 sudo 執行,但需注意安全風險。
  2. 特殊字元處理:檔案名稱若包含空白或特殊字元,建議在 -exec 中使用 -print0 搭配 xargs -0 來處理,避免路徑解析錯誤。
    find . -type f -name "*.log" -print0 | xargs -0 rm -f

小結

find 指令以其靈活的條件組合與強大的動作執行能力,成為 Linux 系統管理的基石。從基本的檔案名稱搜尋,到結合時間、大小、權限的複雜過濾,再到批次刪除與壓縮,find 都能勝任。建議讀者在日常工作中,多嘗試將上述範例應用於實際情境,並善用 -exec-print0 來提升操作的穩定性與效率。熟練掌握這 50 個範例的核心邏輯,你將能輕鬆應對各種檔案管理挑戰。