Shell 在多个文件中搜索是否存在模式

Shell 在多个文件中搜索是否存在模式,shell,unix,command-line,grep,Shell,Unix,Command Line,Grep,我需要确保在父目录中找到的所有文件都有一个特定的模式。 例如: 该命令应返回false,因为文件2没有foo。 我在下面尝试,但不知道如何在单个命令中实现这一点 find . -name "status" | xargs grep -c "foo" -c选项统计找到模式的次数。您不需要find,而需要为grep使用-r和-include选项 $ grep -r -c foo --include=status -r对符合状态的文件进行模式递归搜索 例如。我在三个目录中有四个文件。每个都有一条线

我需要确保在父目录中找到的所有文件都有一个特定的模式。 例如:

该命令应返回false,因为文件2没有foo。 我在下面尝试,但不知道如何在单个命令中实现这一点

find . -name "status" | xargs grep -c "foo"

-c
选项统计找到模式的次数。您不需要
find
,而需要为grep使用
-r
-include
选项

$ grep -r -c foo --include=status
-r
对符合
状态的文件进行模式递归搜索

例如。我在三个目录中有四个文件。每个都有一条线

$ cat a/1.txt b/1.txt b/2.txt c/1.txt 
foobar
bar
foo
bazfoobar
使用上面的
grep
,您将得到类似的结果

$ grep -ir -c foo --include=1.txt
a/1.txt:1
b/1.txt:0
c/1.txt:1

-c
选项统计找到模式的次数。您不需要
find
,而需要为grep使用
-r
-include
选项

$ grep -r -c foo --include=status
-r
对符合
状态的文件进行模式递归搜索

例如。我在三个目录中有四个文件。每个都有一条线

$ cat a/1.txt b/1.txt b/2.txt c/1.txt 
foobar
bar
foo
bazfoobar
使用上面的
grep
,您将得到类似的结果

$ grep -ir -c foo --include=1.txt
a/1.txt:1
b/1.txt:0
c/1.txt:1

您可以计算不包含“foo”的文件的数量,如果数量>0,则表示至少有一个文件不包含“foo”:

或 使用iamauser答案进行优化(谢谢):

如果树中的所有文件都命名为“status”,则可以使用更简单的命令行:

grep -ir -c "foo"  | grep -c ':0$'
有支票

r=`grep -ir -c foo  | grep -c ':0$'`
if [ "$r" != "0" ]; then
   echo "false"
fi

您可以计算不包含“foo”的文件的数量,如果数量>0,则表示至少有一个文件不包含“foo”:

或 使用iamauser答案进行优化(谢谢):

如果树中的所有文件都命名为“status”,则可以使用更简单的命令行:

grep -ir -c "foo"  | grep -c ':0$'
有支票

r=`grep -ir -c foo  | grep -c ':0$'`
if [ "$r" != "0" ]; then
   echo "false"
fi

如果希望
find
输出可由
xargs
读取的文件列表,则需要使用:

find . -name "status" -print0 | xargs -0 grep foo` to avoid filenames with special characters (like spaces and newlines and tabs) in them.
但我的目标是这样的:

find . -name "status" -exec grep "foo" {} \+
终止
\+
-exec
会导致
find
将找到的所有文件附加到
grep
命令的单个实例上。这比为找到的每个文件运行一次
grep
要高效得多,如果使用
\

grep
的默认行为是显示文件名和匹配项,如您在问题中所示。您可以使用以下选项更改此行为:

  • -h
    。。。不显示文件名
  • -l
    。。。仅显示匹配的文件,不显示匹配的文本,
  • -L
    。。。仅显示不匹配的文件,即没有模式的文件

最后一个听起来像是您实际要查找的文件。

如果您希望
查找
输出可由
xargs
读取的文件列表,则需要使用:

find . -name "status" -print0 | xargs -0 grep foo` to avoid filenames with special characters (like spaces and newlines and tabs) in them.
find . -name 'status' -exec grep -L 'foo' {} + | awk 'NF{exit 1}'
但我的目标是这样的:

find . -name "status" -exec grep "foo" {} \+
终止
\+
-exec
会导致
find
将找到的所有文件附加到
grep
命令的单个实例上。这比为找到的每个文件运行一次
grep
要高效得多,如果使用
\

grep
的默认行为是显示文件名和匹配项,如您在问题中所示。您可以使用以下选项更改此行为:

  • -h
    。。。不显示文件名
  • -l
    。。。仅显示匹配的文件,不显示匹配的文本,
  • -L
    。。。仅显示不匹配的文件,即没有模式的文件
最后一个听起来像你真正想要的

find . -name 'status' -exec grep -L 'foo' {} + | awk 'NF{exit 1}'
如果所有文件都包含“foo”,则上述文件的退出状态将为0,否则为1


如果所有文件都包含“foo”,则上述文件的退出状态为0,否则为1。

1。这个grep模式在整个目录中,然后只包括“included”文件中的搜索吗?这太慢了,因为find减少了我的搜索空间。是的,
-r
选项在
--include
中对文件进行递归搜索,然后搜索模式。1。这个grep模式在整个目录中,然后只包括“included”文件中的搜索吗?这太慢了,因为find减少了我的搜索空间。是的,
-r
选项对
--include
中的文件进行递归搜索,然后搜索模式。