Linux find 搜尋檔案

find 是 Linux 中功能最強大、參數也最複雜的搜尋工具。不同於 locate (透過資料庫快速搜尋),find 會實際遍歷檔案系統,因此速度較慢,但即時性與準確性最高,且支援各種複雜的搜尋條件。

基本語法

find [搜尋路徑] [搜尋條件] [處理動作]

如果沒有指定路徑,預設為「目前目錄」。 如果沒有指定動作,預設為「顯示路徑」。

常用搜尋條件

1. 依照「檔名」搜尋 (-name)

這是最常用的功能。支援萬用字元 * (務必用引號包起來)。

# 在目前目錄 (及子目錄) 找名為 config.php 的檔案
find . -name "config.php"

# 在 /var/log 目錄下找所有 .log 結尾的檔案
find /var/log -name "*.log"

# 不區分大小寫搜尋 (-iname)
find . -iname "readme.txt"

2. 依照「檔案類型」搜尋 (-type)

有時候你想找的是目錄而不是檔案,這時可以用 -type

  • f:一般檔案 (File)
  • d:目錄 (Directory)
  • l:連結檔 (Link)
# 只搜尋目錄
find . -type d -name "backup"

3. 依照「修改時間」搜尋 (-mtime)

這在系統管理中非常實用,例如「找出 7 天前的 Log 檔並刪除」。

  • -mtime n:剛好在 n 天前 (24*n 小時) 修改過的檔案。
  • -mtime +n:超過 n 天之前 (n天以外) 修改過的檔案。
  • -mtime -n:最近 n 天內 (n天以內) 修改過的檔案。
# 找出「30 天以前」修改過的檔案
find /var/log -mtime +30

# 找出「最近 24 小時內」被修改過的檔案
find . -mtime -1

4. 依照「檔案大小」搜尋 (-size)

  • +:大於
  • -:小於
  • 單位:k (KB), M (MB), G (GB)
# 找出大於 100MB 的大檔案
find / -size +100M

# 找出空白檔案 (大小為 0)
find . -empty

5. 依照「權限」搜尋 (-perm)

# 找出權限剛好為 777 的危險檔案
find . -perm 777

進階:找到後執行指令 (-exec)

find 最強大的地方在於它可以把找到的檔案,直接傳給下一個指令處理。 語法結構:-exec 指令 {} \;

  • {}:代表找到的檔案路徑。
  • \;:代表指令結束 (反斜線是為了跳脫分號)。

實戰範例

1. 找出所有 .tmp 檔案並刪除

find . -name "*.tmp" -exec rm {} \;

這比 rm *.tmp 更強,因為它可以遞迴搜尋子目錄。

2. 找出所有 .txt 檔案並修改權限為 644

find . -name "*.txt" -exec chmod 644 {} \;

3. 結合 grep 搜尋內容

找出所有 .php 檔案,並且裡面包含 "password" 字串的檔案。

find . -name "*.php" -exec grep -l "password" {} \;

總結

find 的組合千變萬化,初學者建議先熟悉 -name (找檔名)、-type (找目錄或檔案) 和 -mtime (找時間) 即可應付 80% 的需求。小心使用 -exec rm,刪錯了也是找不回來的!