如何限制grep只搜索你想要的文件

我们有一个相当庞大而复杂的文件系统,我试图生成一个包含特定文本字符串的文件列表。 这应该很简单,但我需要排除'./svn'和'./pdv'目录(可能还有其他目录),并且只查看* .p,* .w或.i类型的文件。

我可以通过一个程序轻松完成此任务,但运行速度非常慢。 我想加快这个过程(这样我就不会重复搜索数以千计的文件),因为我需要对一长串标准运行这样的搜索。

通常,我们使用以下命令搜索文件系统:

find . -name "*.[!r]*" -exec grep -i -l "search for me" {} ;

这是行得通的,但我不得不使用一个程序来排除不需要的目录,所以它运行速度非常缓慢。

在看这里的主题:堆栈溢出线程

我决定尝试一些其他的方法:

grep -ilR "search for me" . --exclude ".svn" --excluse "pdv" --exclude "!.{p,w,i*}" 

不包括'./svn',但不包含'./pdv'目录,不限制查看的文件。

grep -ilR "search for me" . --exclude ".svn" --excluse "pdv" --include "*.p" 

不包括'./svn',但不包含'./pdv'目录,不限制查看的文件。

find . -name "*.[!r]*" -exec grep -i -l ".svn" | grep -i -l "search for me" {} ;

我甚至无法获得这个(或其变体)以成功运行。

find . ! -name "*.svn*" -prune -print -exec grep -i -l "search for me" {} ;

不返回任何东西。 它看起来像一旦找到.svn目录就会停下来。


感觉如何:

find . ( ( -name .svn -o -name pdv ) -type d -prune ) -o ( -name '*.[pwi]' -type f -exec grep -i -l "search for me" {} + )

这会:
- 忽略名为.svn和pdv的目录的内容
- 名为*的grep文件(和符号链接到文件)。[pwi]

exec后的+选项意味着将多个文件集中到一个命令行中(在Linux中大约为100万个字符)。 如果您必须遍历数千个文件,这可能会严重加速处理。


以下命令仅查找包含require 'bundler/setup'行的* .rb文件,并排除在.git.bundle目录中搜索。 我认为这是相同的用例。

grep -ril --exclude-dir .git --exclude-dir .bundle 
  --include *.rb "^require 'bundler/setup'$" .

问题在于我相信--exclude--exclude-dir参数的交换。 参考grep(1)手册。

另请注意,exclude / include参数只接受GLOB ,而不是正则表达式,因此单个字符后缀范围可以使用一个--include参数完成,但更复杂的条件将需要更多的参数:

--include *.[pwi] --include *.multichar_sfx ...

您可以尝试以下方法:

find path_starting_point -type f | grep regex_to_filter_file_names | xargs grep regex_to_find_inside_matched_files
链接地址: http://www.djcxy.com/p/47247.html

上一篇: How to limit grep to only search the files that you want

下一篇: grep excluding file name pattern