遞迴搜尋目錄下所有文件:
find dir | xargs grep "pattern"
find file | xargs grep "pattern"
特點:預設遞迴子目錄;xargs 批量構建參數列表,效率高;需注意文件名含空格時需 -print0 | xargs -0。
grep "pattern" dir/* # 僅當前目錄
grep -r "pattern" dir/* # 遞迴子目錄 (-r / -R)
grep "pattern" file # 單文件
特點:語法簡潔,-r 直接支援遞迴,無需管道;-i 忽略大小寫,-n 顯示行號,-l 僅列文件名。
整合上述功能,支援目錄/文件自適應、遞迴開關、大小寫開關:
#!/bin/bash
# find_str.sh path pattern [-r] [-i]
if [ $# -lt 2 ]; then
echo "Usage: $0 path pattern [-r] [-i]"; exit 1
fi
path=$1; pattern=$2; shift 2
dir_op=""; lu_op=""
for opt in "$@"; do
case $opt in
-r) dir_op="-r" ;;
-i) lu_op="-i" ;;
*) echo "invalid option: $opt"; exit 1 ;;
esac
done
grep_file() {
local file=$1 str=$2
local out=$(grep -n $lu_op "$str" "$file" 2>/dev/null)
[ -n "$out" ] && [ "$file" != "$0" ] && echo "$file: $out"
}
find_str() {
local target=$1 str=$2
if [ -d "$target" ]; then
for f in "$target"/*; do
if [ "$dir_op" = "-r" ] && [ -d "$f" ]; then
find_str "$f" "$str"
elif [ -f "$f" ]; then
grep_file "$f" "$str"
fi
done
elif [ -f "$target" ]; then
grep_file "$target" "$str"
fi
}
find_str "$path" "$pattern"
./find_str.sh /usr/include main # 非遞迴、大小寫敏感
./find_str.sh /usr/include main -i # 非遞迴、忽略大小寫
./find_str.sh /usr/include main -r # 遞迴、大小寫敏感
./find_str.sh /usr/include main -r -i # 遞迴、忽略大小寫
./find_str.sh main.cpp main # 檔案搜尋
sed 替換 grep 實現替換/格式化輸出。wc -l 統計匹配行數。-E 擴展正則、-w 全字匹配。ripgrep (rg) / ag,速度遠超 grep。掌握 find/xargs、grep -r 兩大核心組合,覆蓋 90% 搜尋需求。自定義腳本封裝常用參數,提升日常開發效率。大型專案請升級現代工具(rg/ag)獲得最佳體驗。