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,刪錯了也是找不回來的!