递归搜索特定扩展名文件中的内容
递归搜索特定扩展名文件中的内容
在日常的系统运维和开发工作中,经常需要在大量文件中搜索特定的内容,并且只希望搜索特定扩展名的文件。下面介绍几种实现该功能的方法。
实现步骤
使用 grep 的 –include 参数
可以使用 grep 命令的 --include 参数来指定要搜索的文件扩展名。例如,要在 ~/path[12345] 目录下递归搜索包含 CP_Image 的 .h 和 .cpp 文件,可以使用以下命令:
1 | |
解释:
grep:命令本身。-r:递归搜索。-i:忽略大小写。-n:显示每行在文件中的相对行号。--include=\*.cpp:只搜索.cpp文件。--include=\*.h:只搜索.h文件。
也可以简化为:
1 | |
使用 find 命令
使用 find 命令可以更灵活地指定要搜索的文件。例如,要在当前目录下递归搜索包含 CP_Image 的 .h 和 .cpp 文件,可以使用以下命令:
1 | |
解释:
find:命令本身。-type f:只搜索文件。-name '*.h':搜索.h文件。-o:逻辑或。-name '*.cpp':搜索.cpp文件。-exec grep "CP_Image" {} +:对找到的每个文件执行grep命令。
使用 ag(the silver searcher)
ag 是一个快速的文本搜索工具,使用简单。例如,要在 <path> 目录下搜索包含 CP_Image 的 .h 和 .cpp 文件,可以使用以下命令:
1 | |
解释:
-G:只搜索文件名匹配指定模式的文件。
结合 find 和 xargs
可以使用 find 命令查找特定扩展名的文件,然后使用 xargs 命令将这些文件传递给 grep 命令。例如,要在当前目录下递归搜索包含 string 的 .extension 文件,可以使用以下命令:
1 | |
解释:
2>/dev/null:将错误输出重定向到/dev/null,即忽略错误信息。
要搜索多个扩展名的文件,可以使用逻辑或 -o 连接多个 -name 参数:
1 | |
最佳实践
- 如果只需要搜索少量文件类型,使用
grep的--include参数是最简单的方法。 - 如果需要更复杂的文件筛选条件,或者在不支持
grep递归搜索的系统上,使用find命令更合适。 - 如果对搜索速度有较高要求,可以考虑使用
ag工具。
常见问题
- 权限问题:在使用
find命令搜索整个系统时,可能会遇到权限问题。可以通过添加2>/dev/null来忽略这些错误信息。 - 文件名中的特殊字符:在使用
grep的--include参数时,需要注意文件名中的特殊字符,如*,可以使用\进行转义。
递归搜索特定扩展名文件中的内容
https://119291.xyz/posts/recursively-search-content-in-files-with-specific-extensions/