Linux Unix命令列出包含字符串但*不*包含其他字符串的文件

Linux Unix命令列出包含字符串但*不*包含其他字符串的文件,linux,command-line,find,command,grep,Linux,Command Line,Find,Command,Grep,如何递归地查看包含一个字符串的文件列表,特别是不包含另一个字符串的文件列表?另外,我的意思是评估文件的文本,而不是文件名 结论: 根据评论,我最终使用了: find . -name "*.html" -exec grep -lR 'base\-maps' {} \; | xargs grep -L 'base\-maps\-bot' 这将返回带有“基本映射”而不是“基本映射”的文件。谢谢 试试这个: grep -rl <string-to-match> | xargs grep

如何递归地查看包含一个字符串的文件列表,特别是不包含另一个字符串的文件列表?另外,我的意思是评估文件的文本,而不是文件名


结论:

根据评论,我最终使用了:

find . -name "*.html" -exec grep -lR 'base\-maps' {} \; | xargs grep -L 'base\-maps\-bot'
这将返回带有“基本映射”而不是“基本映射”的文件。谢谢

试试这个:

grep -rl <string-to-match> | xargs grep -L <string-not-to-match>
grep-rl | xargs grep-L

说明:
grep-lr
使grep递归地(r)输出包含
的所有文件的列表(l)。xargs在这些文件上循环,对每个文件调用
grep-L
grep-L
仅在文件不包含

时输出文件名。这些答案似乎与两个字符串不匹配。以下命令应能更好地工作:

grep -l <string-to-match> * | xargs grep -c <string-not-to-match> | grep '\:0'
grep-l*| xargs grep-c | grep'\:0'

这里有一个更通用的结构:

find . -name <nameFilter> -print0 | xargs -0 grep -Z -l <patternYes> | xargs -0 grep -L <patternNo>

上述答案中不需要使用xargs;您可以实现如下相同的目标:

find . -type f -exec grep -q <string-to-match> {} \; -not -exec grep -q <string-not-to-match> {} \; -print
find-类型f-exec grep-q{}\-not-exec grep-q{}\-打印
grep-q
表示安静运行,但返回一个退出代码,指示是否找到匹配项<代码>查找然后可以使用该退出代码来确定是否继续执行其其余选项。如果
-exec grep-q{}
返回0,然后它将继续执行
-not-exec grep-q{}。如果它也返回0,它将继续执行
-print
,这将打印文件名

正如另一个答案所指出的,以这种方式使用
find
比只想搜索特定类型文件的
grep-Rl
有很大的优势。另一方面,如果确实要搜索所有文件,
grep-Rl
可能更快,因为它使用一个
grep
过程对所有文件执行第一次筛选,而不是对每个文件执行单独的
grep
过程。


此命令将获取同一目录中不包含“字符串不匹配”的所有“.py”文件。

匹配字符串A并排除我使用的同一行中存在的字符串B&C,以及引号以允许搜索字符串包含空格

grep -r <string A> | grep -v -e <string B> -e "<string C>" | awk -F ':' '{print $1}'
grep-r | grep-v-e-e“| awk-F”:“{print$1}”
说明:grep-r递归过滤输出格式中匹配的所有行

文件名:行


要从这些行中排除(grep-v)也包含-e字符串B或-e字符串C的行。awk用于仅打印第一个字段(文件名),使用冒号作为字段分隔符-F

最简单的方法是使用
grep-l
列出与模式匹配的文件,然后将其传送到
grep-v
。属于Mikel:但是,它将只将文件名通过管道传输到另一个
grep
,而另一个只能从这些文件名中过滤,而不能从文件内容中过滤。我已经尝试过了,并且同意Alan的说法,它只过滤文件名。因此,它并没有实现我所希望的。@Alan你不能向grep传递一个文件集吗?如果是,你不能基于另一个grep传递一个文件集吗?这只是我想象的可能性,但如果有人知道怎么做,那就太棒了:d grep字符串应该被引用还是转义?是和否。另外,是否有一种好方法可以通过只包含.html文件来提高流程的效率?@Matrym
find-名称“*.html”-exec grep-l{}\|xargs grep-L
@chrisaycock添加R和转义连字符,这看起来对吗?找到-名称“*.html”-exec grep-lR'base \-maps'{}\|xargs grep-L'base \-maps \-bot'非常棒。太棒了。请为您的代码添加一点解释以获取更多信息。
grep -r <string A> | grep -v -e <string B> -e "<string C>" | awk -F ':' '{print $1}'