bash:如何将'find'与'-exec grep'结合使用来搜索一对空牙套



我知道还有其他方法可以做到这一点,但我很好奇,请耐心听我说。

我想搜索一个目录树的JSON清单文件包含确切的字符串:"submodules": {},从詹金斯管道的结果。

我尝试了几个组合,找到了一个为我找到所有相关位置的组合:

find . -type f -name *.json -exec grep -FHm 1 '"submodules": {' {} ;

这个工作,所以我的问题解决了

但是现在我很好奇:我知道{}对find命令有特殊的含义。我如何重写查找命令来查找"submodules": {}?直观的第一次尝试是:

find . -type f -name *.json -exec grep -FHm 1 '"submodules": {}' {} ;

但是,即使shell因为单引号而不触及搜索字符串,find命令也没有这样的限制,并且命令什么也找不到。

我尝试了几种引用和转义的方法,但找不到一个有效的组合。有人知道吗?

使用egrep/grep -E的解决方案:

find . -type f -name '*.json' -exec grep -EHm 1 '"submodules": {}' {} ;
find . -type f -name '*.json' -exec egrep -Hm 1 '"submodules": {}' {} ;

使用普通grep(没有-F),通过添加冗余字符类:

find . -type f -name '*.json' -exec grep -Hm 1 '"submodules": [{]}' {} ;

你也可以创建一个文件来运行grep,例如grep.sh:

cat > grep.sh <<SH
#!/bin/sh
grep -FHm 1 '"submodules": {}' "$@"
SH
chmod +x grep.sh

然后通过find:

执行脚本文件
find . -type f -name '*.json' -exec ./grep.sh {} ;

可以转义第二个括号,但是需要去掉-F:

find . -type f -name *.json -exec grep -Hm 1 '"submodules": {}' {} ;

此外,使用+代替;可能会同时运行grep多个文件,也就是说,可能会更快。