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

时间:2011-08-18 10:51:06

标签: unix grep find

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

我可以使用程序轻松完成此操作,但运行速度非常慢。我想加快这个过程(因此我不会反复搜索数千个文件),因为我需要针对一长串标准运行此类搜索。

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

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

这是有效的,但我必须使用程序来排除不需要的目录,因此运行速度非常慢。

在这里查看主题后: Stack Overflow thread

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

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目录就会停止。

4 个答案:

答案 0 :(得分:2)

以下命令仅查找包含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,而不接受regexp,因此单个字符后缀范围可以使用一个--include参数完成,但更复杂的条件需要更多参数:< / p>

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

答案 1 :(得分:2)

如下:

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

这将:
- 忽略名为.svn和pdv的目录的内容 - 名为*。[pwi]

的grep文件(和符号链接到文件)

+之后的exec选项意味着将多个文件收集到一个命令中,这将适合命令行(Linux中大约100万个字符)。如果必须迭代数千个文件,这可以大大加快处理速度。

答案 2 :(得分:0)

您可以尝试以下操作:

find path_starting_point -type f | grep regex_to_filter_file_names | xargs grep regex_to_find_inside_matched_files

答案 3 :(得分:0)

find . -name "filename_regex"|grep -v '.svn' -v '.pdv'|xargs grep -i 'your search string'