如何查找不包含给定字符串模式的文件?

本文介绍了如何使用grep和find命令在当前目录及其子目录中查找不包含特定模式的文件。讨论了不同选项如`-v`, `-L`以及`ag`(Silver Searcher)的使用,并提供了在grep不具备某些选项时的替代解决方案。" 124814433,7790546,AM5728 GStreamer视频开发:实时处理与时延测试,"['音视频', '嵌入式硬件', 'arm', 'FPGA开发', '视频开发']
摘要由CSDN通过智能技术生成

如何找出其中包含单词当前目录下的文件 foo (使用grep )?


#1楼

如果您的grep具有-L (或--files-without-match )选项:

$ grep -L "foo" *

#2楼

以下命令为我提供了所有不包含foo模式的文件:

find .  -not  -ipath '.*svn*' -exec  grep  -H -E -o -c  "foo"  {} \; | grep 0

#3楼

我祝你好运

grep -H -E -o -c "foo" */*/*.ext | grep ext:0

我使用grep -v尝试只是给了我所有没有“ foo”的行。


#4楼

以下命令可以帮助您过滤包含子字符串“ foo”的行。

cat file | grep -v "foo"

#5楼

grep -irnw "filepath" -ve "pattern"

要么

grep -ve "pattern" < file

上面的命令将为我们提供结果,因为-v查找正在搜索的模式的逆函数


#6楼

您实际上需要:

find .  -not  -ipath '.*svn*' -exec  grep  -H -E -o -c  "foo"  {} \; | grep :0\$

#7楼

看看ack 。 它会自动为您执行.svn排除,为您提供Perl正则表达式,并且只需下载一个Perl程序即可。

与您要查找的内容等效的是ack

ack -L foo

#8楼

我的grep没有任何-L选项。 我确实找到解决此问题的方法。

这些想法是:

  1. 将包含应有字符串的所有文件名转储到txt1.txt中。
  2. 将目录中的所有文件名转储到txt2.txt中。
  3. 用diff命令区别2个转储文件。

     grep 'foo' *.log | cut -c1-14 | uniq > txt1.txt grep * *.log | cut -c1-14 | uniq > txt2.txt diff txt1.txt txt2.txt | grep ">" 

#9楼

find *20161109* -mtime -2|grep -vwE "(TRIGGER)"

您可以在“查找”下指定过滤器,并在“ grep -vwE”下指定排除字符串。 如果您还需要过滤修改的时间,请在find下使用mtime。


#10楼

打开错误报告

正如@tukan所评论的那样,有一个关于-L / --files-without-matches标志的针对Ag的公开错误报告:

由于错误报告的进展很少,因此,只要未解决该错误,就不要依赖下面提到的-L选项。 请改用此线程中介绍的不同方法。 引用有关错误报告的评论[强调我的]:

有任何更新吗? -L完全忽略文件第一行上的匹配项。 好像这不会很快解决, 应该将标志完全删除,因为它实际上根本无法像广告中那样工作


Silver Searcher-Ag(预期功能-参见错误报告)

作为grep的强大替代品,您可以使用The Silver Searcher-Ag

一个类似于ack的代码搜索工具,重点是速度。

查看man ag ,我们找到-L--files-without-matches选项:

 ... OPTIONS ... -L --files-without-matches Only print the names of files that don´t contain matches. 

即,要从当前目录中递归搜索与foo不匹配的文件:

ag -L foo

要仅在当前目录中搜索与foo不匹配的文件,只需为递归指定--depth=0即可:

ag -L foo --depth 0

#11楼

问题

我需要重构一个大型项目,该项目使用.phtml文件使用嵌入式PHP代码编写HTML。 我想改用Mustache模板。 我想找到任何不包含字符串new Mustache .phtml ,因为它们仍然需要重写。

find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \\; | grep :0$ | sed 's/..$//'

说明

管道前:

find . 从此目录开始递归查找文件

-iname '*.phtml'文件名必须包含.phtmli将其区分大小写)

-exec 'grep -H -E -o -c 'new Mustache' {}'在每个匹配的路径上运行grep命令

格列普

-H始终使用输出行打印文件名标题。

-E模式解释为扩展的正则表达式(即,强制grep表现为egrep)。

-o仅打印行的匹配部分。

-c仅将选定的行数写入标准输出。


这将为我提供所有以.phtml结尾的文件路径的列表,并计算每个字符串中出现new Mustache字符串的次数。

$> find . -iname '*.phtml$' -exec 'grep -H -E -o -c 'new Mustache' {}'\;

./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml:0
./app/MyApp/Customer/View/Account/studio.phtml:0
./app/MyApp/Customer/View/Account/orders.phtml:1
./app/MyApp/Customer/View/Account/banking.phtml:1
./app/MyApp/Customer/View/Account/applycomplete.phtml:1
./app/MyApp/Customer/View/Account/catalogue.phtml:1
./app/MyApp/Customer/View/Account/classadd.phtml:0
./app/MyApp/Customer/View/Account/orders-trade.phtml:0

第一个管道grep :0$过滤此列表,使其仅包含以:0结尾的行:

$> find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$

./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml:0
./app/MyApp/Customer/View/Account/studio.phtml:0
./app/MyApp/Customer/View/Account/classadd.phtml:0
./app/MyApp/Customer/View/Account/orders-trade.phtml:0

第二个管道sed 's/..$//'去除了每行的最后两个字符,仅保留了文件路径。

$> find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'

./app/MyApp/Customer/View/Account/quickcodemanagestore.phtml
./app/MyApp/Customer/View/Account/studio.phtml
./app/MyApp/Customer/View/Account/classadd.phtml
./app/MyApp/Customer/View/Account/orders-trade.phtml

#12楼

您可以单独使用grep来执行此操作(无查找)。

grep -riL "foo" .

这是grep使用的参数的说明

     -L, --files-without-match
             each file processed.
     -R, -r, --recursive
             Recursively search subdirectories listed.

     -i, --ignore-case
             Perform case insensitive matching.

如果使用l (小写),则会得到相反的结果(带有匹配项的文件)

     -l, --files-with-matches
             Only the names of files containing selected lines are written

#13楼

当grep没有-L选项(例如IBM AIX)时,除了grep和shell之外,没有任何其他选择:

for file in * ; do grep -q 'my_pattern' $file || echo $file ; done

#14楼

以下命令排除了查找使用第二个grep过滤出svn文件夹的需要。

grep -rL "foo" ./* | grep -v "\.svn"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值