Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 如何限制grep只搜索您想要的文件_Unix_Grep_Find - Fatal编程技术网

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

Unix 如何限制grep只搜索您想要的文件,unix,grep,find,Unix,Grep,Find,我们有一个相当大和复杂的文件系统,我试图生成一个包含特定文本字符串的文件列表。这应该很简单,但我需要排除“/svn”和“/pdv”目录(可能还有其他目录),并且只查看类型为*.p、*.w或.I的文件 我可以用一个程序轻松地做到这一点,但事实证明它运行起来非常慢。我想加快这个过程(这样我就不会重复搜索数千个文件),因为我需要根据一长串的条件运行这样的搜索 通常,我们使用以下方法搜索文件系统: find . -name "*.[!r]*" -exec grep -i -l "search for m

我们有一个相当大和复杂的文件系统,我试图生成一个包含特定文本字符串的文件列表。这应该很简单,但我需要排除“/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" 
find . -name "*.[!r]*" -exec grep -i -l ".svn" | grep -i -l "search for me" {} \;
排除“./svn”,但不排除“./pdv”目录,不会限制查看的文件

grep -ilR "search for me" . --exclude ".svn" --excluse "pdv" --include "*.p" 
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 path_starting_point -type f | grep regex_to_filter_file_names | xargs grep regex_to_find_inside_matched_files

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

grep -ril --exclude-dir .git --exclude-dir .bundle \
  --include \*.rb "^require 'bundler/setup'$" .
我认为问题在于交换
--exclude
--exclude dir
参数。请参阅
grep(1)
手册

还请注意,排除/包含参数仅接受
GLOB
,而不接受regexp,因此可以使用一个
--include
参数来完成单字符后缀范围,但更复杂的条件需要更多的参数:

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

比如说:

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万个字符)。如果你必须迭代数千个文件,这会大大加快处理速度。

我已经尝试过了,但我无法让“regex\u to\u filter\u file\u names”正常工作。我试过
查找-键入f | grep.\.p | xargs-il grep“run”
,但它返回的文件以.ixx结尾,也以.p结尾。也许
grep'\.\.\[pwi\]$'
匹配以.p“,.w”或.i”结尾的文件。我也尝试了一下,但仍然无法让正则表达式工作。仅使用
find的一个简单示例-命名“*\.i”
来尝试这个概念并没有返回任何值。明确地说,我要查找与“.p”、“.w”或“.i”中任何一个匹配的所有文件,并且不包括名为“.svn”和“pdv”的目录。在您的示例中,很多感谢都是
——在这两种情况下都不包括“pdv”(请注意打字错误s/d),您正在抱怨特定条件不起作用。。。只是检查打字错误并不是主要问题。我认为“哦!”是一个好的开始。感谢您发现了这一点。@geronime,我刚刚尝试了这个示例,并修复了打字错误(我希望如此)。搜索字符串是
grep-ilR“run”--排除“.svn”--排除“pdv”--排除“!.{p,w,i*}”
。不幸的是,由于结果集现在包括
.svn/text base/jr83144.p.svn-base
pdv/cm/backupds.i
我认为这不起作用。您是否尝试过
--exclude dir
参数?我想这就是问题所在。请参阅
grep
手册。