我知道还有其他方法可以做到这一点,但我很好奇,请耐心听我说。
我想搜索一个目录树的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
多个文件,也就是说,可能会更快。