我们有一个相当大而复杂的文件系统,我正在尝试生成包含特定文本字符串的文件列表。这应该很简单,但我需要排除' ./ 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目录就会停止。
答案 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]
+
之后的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'