【发布时间】:2011-08-18 10:51:06
【问题描述】:
我们有一个相当大而复杂的文件系统,我正在尝试生成一个包含特定文本字符串的文件列表。这应该很简单,但我需要排除 './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 目录就停止了。
【问题讨论】:
-
明确地说,我正在寻找与“.p”、“.w”或“.i”中的任何一个匹配的所有文件,并且不包括名为“.svn”和“pdv”的目录。非常感谢
-
在你的例子中,
--excluse "pdv"(注意错字 s/d)在这两种情况下,你都在抱怨那个特定的条件不起作用......只是检查错字不是主要问题。跨度> -
好吧,我认为“D'Oh!”是一个好的开始。感谢您发现这一点。
-
@geronime,我刚刚尝试了修复错字的示例(我希望如此)。搜索字符串为
grep -ilR "run" . --exclude ".svn" --exclude "pdv" --exclude "!.{p,w,i*}"。不幸的是,由于结果集现在包括.svn/text-base/jr83144.p.svn-base和pdv/cm/backupds.i,我认为这不起作用。非常感谢 -
你有没有试过
--exclude-dir参数?这实际上是我认为的问题。参考grep的手册。