编写可接收任意参数的Bash函数,实现多字符串逻辑与的文件Grep
实现多字符串匹配文件的Bash函数
基础实现(适用于文件名无特殊字符场景)
fn() { if [ $# -eq 0 ]; then echo "用法: fn <字符串1> <字符串2> ..." return 1 fi # 初始化第一个匹配命令 local cmd="find . -type f -exec grep -l '$1' {} \;" shift # 循环追加后续匹配管道 for str in "$@"; do cmd+=" | xargs grep -l '$str'" done # 执行拼接后的命令 eval "$cmd" }
健壮版实现(支持含空格/特殊字符的文件名)
如果你的文件或目录名包含空格、换行符等特殊字符,建议用这个版本,通过空字符分隔避免解析错误:
fn() { if [ $# -eq 0 ]; then echo "用法: fn <字符串1> <字符串2> ..." return 1 fi # 初始匹配:用-Z输出空分隔的文件名,+批量处理文件提升效率 local cmd="find . -type f -exec grep -lZ '$1' {} +" shift # 循环处理剩余字符串,每一步都用空分隔传递文件名 for str in "$@"; do cmd+=" | xargs -0 grep -lZ '$str'" done # 最后将空分隔的文件名转为换行输出 cmd+=" | xargs -0 echo" eval "$cmd" }
使用说明
直接在终端执行函数定义(或者把它加到~/.bashrc里永久生效),之后就能像这样调用:
fn string1 string2 string3
该命令会返回当前目录及子目录下,同时包含所有传入字符串的普通文件列表。
实现逻辑
- 参数检查:如果没有传入任何字符串,直接提示用法并退出,避免无效执行。
- 初始命令构建:先用
find遍历所有普通文件,并用第一个字符串做初始匹配,grep -l只输出匹配到的文件名。 - 循环追加管道:对剩余的每个字符串,依次追加匹配命令,让每一步都在上一步筛选出的文件中继续匹配下一个字符串。
- 执行命令:用
eval执行拼接好的完整管道命令,实现递进式的多字符串匹配。
内容的提问来源于stack exchange,提问作者matohak
相关产品推荐
相关产品推荐

