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

时间:2009-11-17 11:07:15

标签: file grep directory find

如何在当前目录中找到包含单词foo文件(使用grep)?

16 个答案:

答案 0 :(得分:726)

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

$ grep -L "foo" *

答案 1 :(得分:44)

看看ack。它会自动为您排除.svn,为您提供Perl正则表达式,并且是单个Perl程序的简单下载。

ack

中,相当于您要查找的内容
ack -L foo

答案 2 :(得分:14)

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

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

答案 3 :(得分:13)

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

grep -rL "foo" ./* | grep -v "\.svn"

答案 4 :(得分:9)

如果您使用的是git,它将搜索所有跟踪的文件:

git grep -L "foo"

,如果您打开了**子目录范围(.bashrc中的shopt -s globstar,请参见this),则可以搜索跟踪文件的子集:

git grep -L "foo" -- **/*.cpp

答案 5 :(得分:8)

您实际需要:

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

答案 6 :(得分:6)

我好运

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

我对grep -v的尝试只给了我所有不带“foo”的行。

答案 7 :(得分:1)

我的grep没有任何-L选项。我找到了解决方法来实现这一目标。

这些想法是:

  1. 将包含deserved字符串的所有文件名转储到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 ">"
    

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

打开错误报告

如@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

答案 10 :(得分:1)

问题

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

解决方案

new Mustache

说明

在管道之前:

查找

find . -iname '*.phtml' -exec grep -H -E -o -c 'new Mustache' {} \; | grep :0$ | sed 's/..$//'从此目录开始递归查找文件

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

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

Grep

grep始终打印带有输出行的文件名标题。

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

-E仅打印行中匹配的部分。

-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/..$//'

答案 11 :(得分:1)

您可以单独使用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

答案 12 :(得分:1)

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

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

答案 13 :(得分:1)

使用查找时,有两个基本选项:查找完成搜索后过滤结果,或使用一些内置选项,这些选项将阻止查找考虑那些与某些给定模式匹配的文件和目录。

如果对大量文件和目录使用前一种方法。您将使用大量的CPU和RAM只是将结果传递给第二个进程,这又将通过使用大量资源来过滤出结果。

如果使用作为查找参数的-not关键字,则将防止考虑与后面的-name或-regex参数上的字符串匹配的任何路径,这将大大提高效率。

const gap = 16;
const carousel = document.getElementById("carousel"),
  content = document.getElementById("content"),
  next = document.getElementById("next"),
  prev = document.getElementById("prev");

next.addEventListener("click", e => {
  carousel.scrollBy(width + gap, 0);
  if (carousel.scrollWidth !== 0) {
    prev.style.display = "flex";
  }
  if (content.scrollWidth - width - gap <= carousel.scrollLeft + width) {
    next.style.display = "none";
  }
});
prev.addEventListener("click", e => {
  carousel.scrollBy(-(width + gap), 0);
  if (carousel.scrollLeft - width - gap <= 0) {
    prev.style.display = "none";
  }
  if (!content.scrollWidth - width - gap <= carousel.scrollLeft + width) {
    next.style.display = "flex";
  }
});

let width = carousel.offsetWidth;
window.addEventListener("resize", e => (width = carousel.offsetWidth));
              
           

然后,未被-not过滤掉的任何路径将被后续的-regex参数捕获。

答案 14 :(得分:-3)

grep -irnw "filepath" -ve "pattern"

grep -ve "pattern" < file

上面的命令将给出结果,因为-v找到被搜索模式的反转

答案 15 :(得分:-4)

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

cat file | grep -v "foo"