【问题标题】:How to limit grep to only search the files that you want如何限制 grep 仅搜索您想要的文件
【发布时间】: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-basepdv/cm/backupds.i,我认为这不起作用。非常感谢
  • 你有没有试过--exclude-dir参数?这实际上是我认为的问题。参考grep的手册。

标签: unix grep find


【解决方案1】:

怎么样:

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】:

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

    grep -ril --exclude-dir .git --exclude-dir .bundle \
      --include \*.rb "^require 'bundler/setup'$" .
    

    我相信问题在于交换--exclude--exclude-dir 参数。请参阅grep(1) 手册。

    另请注意,排除/包含参数只接受GLOB,而不接受正则表达式,因此单个字符后缀范围可以用一个--include 参数完成,但更复杂的条件需要更多参数:

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

    【讨论】:

      【解决方案3】:

      您可以尝试以下方法:

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

      【讨论】:

      • 我试过这个,但我不能让“regex_to_filter_file_names”正常工作。我试过find . -type f | grep .*\.p | xargs -il grep "run",但它返回的文件以.ixx 和.p 结尾。
      • 可能grep '\.\[pwi\]$' 匹配以“.p”、“.w”或“.i”结尾的文件>"后缀
      【解决方案4】:
      find . -name "filename_regex"|grep -v '.svn' -v '.pdv'|xargs grep -i 'your search string'
      

      【讨论】:

      • 我也尝试过,但再次无法让正则表达式工作。仅使用find . -name ".*\.i" 的简单示例来尝试该概念不会返回任何值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多