我使用命令递归查找包含某个string1
的文件:
find . -type f -exec grep -H string1 {} \;
我需要查找包含多个字符串的文件,因此命令应该返回包含所有字符串的文件。像这样:
find . -type f -exec grep -H string1 AND string2 {} \;
我找不到办法。字符串可以在文件中的任何位置。即使只有两个字符串的解决方案也不错。
答案 0 :(得分:1)
使用GNU var genericType = property.PropertyType.GetGenericArguments().First();
var method = typeof(Enumerable).GetMethod("Empty").MakeGenericMethod(genericType);
var emptyEnumerable = method.Invoke(null, null);
grep
来自grep -rlZ 'string1' | xargs -0 grep -l 'string2'
-r, - recursive
以符号形式递归读取每个目录下的所有文件 仅当它们在命令行上时才链接。请注意,如果没有文件 给出操作数,grep搜索工作目录。这是 相当于-d recurse选项。
-Z, - 空 输出零字节(ASCII NUL字符),而不是通常在文件后面的字符 名称。例如,grep -lZ在每个文件名后输出一个零字节,而不是通常的换行符。 即使存在包含异常的文件名,此选项也会使输出明确无误 像换行符这样的字符。此选项可用于find -print0,perl -0,sort -z等命令, 和xargs -0处理任意文件名,甚至包含换行符的文件名。
答案 1 :(得分:0)
你也可以试试这个;
find . -type f -exec grep -l 'string1' {} \; | xargs grep -l 'string2'
这显示包含string1和string2
的文件名答案 2 :(得分:0)
您可以链接您的操作并使用第一个的退出状态仅在第一个操作成功时执行第二个操作(省略初级默认值为-and
之间的操作符):
find . -type f -exec grep -q 'string1' {} \; -exec grep -H 'string2' {} \;
第一个grep命令使用-q
," quiet",如果找到该字符串,则返回成功的退出状态。
答案 3 :(得分:0)
从本页的其他答案中可以看出,有几个命令行工具可用于跨文件执行联合搜索。尚未发布的快速灵活的解决方案是使用ag:
ag -l string1 | xargs ag -l string2
对于不区分大小写的搜索,请使用-i
的{{1}}选项:
ag
对于其他搜索字词,请扩展管道:
ag -il string1 | xargs ag -il string2