在Linux终端中进行递归搜索
有时候我们需要对某个目录中的所有文件进行递归式搜索。递归搜索,即搜索该目录中的所有文件和其二级目录下的所有文件,依此类推。本文给出了两种实现思路,分别使用 grep
和 find
命令。
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" "{}"