Shell 在多个文件中搜索是否存在模式
我需要确保在父目录中找到的所有文件都有一个特定的模式。 例如: 该命令应返回false,因为文件2没有foo。 我在下面尝试,但不知道如何在单个命令中实现这一点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对符合状态的文件进行模式递归搜索 例如。我在三个目录中有四个文件。每个都有一条线
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
中的文件进行递归搜索,然后搜索模式。