如何递归查看一个包含某个字符串但不包含另一个字符串的文件列表?同时,我想要评估文件的文本内容而不是文件名。
结论:
根据评论,我最终使用了:
find . -name "*.html" -exec grep -lR 'base\-maps' {} \; | xargs grep -L 'base\-maps\-bot'
这返回的是“base-maps”文件而不是“base-maps-bot”,谢谢!!
如何递归查看一个包含某个字符串但不包含另一个字符串的文件列表?同时,我想要评估文件的文本内容而不是文件名。
结论:
根据评论,我最终使用了:
find . -name "*.html" -exec grep -lR 'base\-maps' {} \; | xargs grep -L 'base\-maps\-bot'
这返回的是“base-maps”文件而不是“base-maps-bot”,谢谢!!
试试这个:
grep -rl <string-to-match> | xargs grep -L <string-not-to-match>
解释:使用grep -lr
可以让grep递归地(r)输出包含<string-to-match>
的所有文件的列表(l)。xargs循环遍历这些文件,在每个文件上调用grep -L
。当文件不包含<string-not-to-match>
时,grep -L
仅会输出文件名。
find
中使用 -R
,因为它已经是递归的了。只有在单独使用 grep
时才使用 -R
。 - chrisaycock在上面的答案中使用xargs是不必要的;你可以按照以下方式实现相同的效果:
find . -type f -exec grep -q <string-to-match> {} \; -not -exec grep -q <string-not-to-match> {} \; -print
grep -q
表示静默运行但返回一个退出码,指示是否找到匹配项;find
可以使用该退出码来确定是否继续执行其余的选项。如果 -exec grep -q <string-to-match> {} \;
返回 0,则会继续执行 -not -exec grep -q <string-not-to-match>{} \;
。如果这也返回 0,则会继续执行 -print
,它会打印文件名。find
比 grep -Rl
有很大的优势。另一方面,如果你真的想搜索所有文件,grep -Rl
可能更快,因为它使用一个 grep
进程来执行所有文件的第一个过滤器,而不是每个文件都使用一个单独的 grep
进程。这些答案似乎有误,因为匹配到了两个字符串。以下命令应该更好:
grep -l <string-to-match> * | xargs grep -c <string-not-to-match> | grep '\:0'
。
find . -name <nameFilter> -print0 | xargs -0 grep -Z -l <patternYes> | xargs -0 grep -L <patternNo>
<nameFilter>
匹配(根据需要调整find
谓词),且包含<patternYes>
但不包含<patternNo>
的文件。find
并在第一个grep
中添加-R
。grep -R -Z -l <patternYes> | xargs -0 grep -L <patternNo>
查找 . -maxdepth 1 -name "*.py" -exec grep -L "string-not-to-match" {} \;
该命令将获取同一目录下所有不包含“string-not-to-match”的“.py”文件。
grep -r <string A> | grep -v -e <string B> -e "<string C>" | awk -F ':' '{print $1}'
说明:grep -r 递归地过滤所有匹配输出格式的行
文件名:行号
为了排除(grep -v)那些也包含-e字符串B或-e字符串C的行。使用awk仅打印第一个字段(文件名),使用冒号作为字段分隔符-F。
grep -l
列出与模式匹配的文件,然后将其管道传输到grep -v
。 - Mikelgrep
,然后只能从这些文件名中过滤,而不能过滤文件内容。 - Alan Haggai Alavils -1 *.html | xargs grep -l '<foo>' - | xargs grep -L '<bar>' -
的操作可以像Sander Marechal所述那样完成。 - Alan Haggai Alavi