跳轉到

建立 2026-09-14 更新 2026-09-14

find 與 grep

兩個問題最常出現:「檔在哪個目錄?」以及「這行 log 在哪個檔?」。find 找檔名與屬性,grep 找檔案內容。

find:從目錄走下去

find . -name '*.log'
find /var/log -type f -mtime -1
find . -type d -name 'src'
  • . 是起點,可改成絕對路徑
  • -name 比對檔名(大小寫敏感;不管大小寫用 -iname
  • -type f 一般檔、-type d 目錄
  • -mtime -1 一天內改過;+7 是七天以前

找到之後直接對每個檔做事:

find . -name '*.tmp' -delete
find . -name '*.sh' -exec chmod u+x {} \;

-exec 裡的 {} 代表目前這個檔,\; 結束這條 -exec

先印出來再刪

不確定條件時,先只跑 find 看清單,確認無誤再加 -deleterm

grep:找文字

grep 'Failed' /var/log/auth.log
grep -n 'TODO' *.py
grep -R 'Listen' /etc/ssh
grep -i error app.log
選項 作用
-n 印行號
-i 忽略大小寫
-R-r 遞迴目錄
-v 反相,印出不含關鍵字的行
-E 延伸正規表示式
-l 只印檔名
grep -E 'error|warn' app.log
ps aux | grep nginx

管線裡的 grep nginx 有時會連 grep 自己那一行一起抓到。要比對程序名,更乾淨的做法是 pgrep nginx,或 grep '[n]ginx' 這種小技巧。

兩個合在一起

find /etc -name '*.conf' | xargs grep -n 'Port'
grep -R --include='*.md' 'TODO' .

現代 GNU grep 的 -R --include 常常就夠用,不一定要先 find。檔非常多、條件很複雜(時間、大小、權限)時,才讓 find 當第一關。

相關的小工具

sort access.log
sort access.log | uniq -c | sort -n
cut -d: -f1 /etc/passwd
  • sort 排序
  • uniq 去掉連續重複行(所以通常先 sort)
  • cut 依分隔符切欄位

這三個加上 grep,已經能應付大多數 log 統計。

總結

檔名與屬性用 find,檔案裡的字用 grep。輸出太多就再接 | less| wc -l。接著可以看機器上正在跑什麼:程序管理