如何限制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