有时候我们需要对某个目录中的所有文件进行递归式搜索。递归搜索,即搜索该目录中的所有文件和其二级目录下的所有文件,依此类推。本文给出了两种实现思路,分别使用 grepfind 命令。

1 使用 grep 命令

grep-r 指令能够实现对某个目录的递归搜索

grep -r pattern

仅列举出满足条件的文件名

grep -r -l pattern

显示所匹配的行号

grep -r -n pattern

仅匹配整个单词

grep -r -w pattern

只对指定后缀的文件进行搜索,并且使用拓展的(extended)正则表达式规则

grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"

在搜索时排除某些后缀名的文件

grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"

2 使用 find 命令

find命令能够遍历目录下的所有文件,给出其文件名,命令如下。

find . -type f -exec grep -l "pattern" {} +

其中, -type f 用于限定搜索对象是文件; -exec {} + 将find得到的文件名称以追加(append)方式传递给grep。

以下命令是为了处理文件名中出现空格的情况。因为,如果文件名中出现了空格,则会将空格作为分隔符处理,导致该文件名被空格截为两段。通过 -print0 将文件名作为整个字符串传递到xargs中,在xargs中通过 -0 取得该文件名。

find /search/dir/ -type f -name "*.log" -print0 | xargs -I {} -0 grep "pattern" "{}"