Windows XP-如何使用 grep 在子目录中的文件中查找字符串

Windows XP-如何使用 grep 在子目录中的文件中查找字符串

我的 PC 上曾经有一个版本的 grep(我认为它是随 Delphi 的早期版本一起提供的),它支持使用开关在嵌套文件夹中进行搜索-r。现在有什么东西(我怀疑是 Delphi 的更高版本)劫持了旧的 grep,并将其替换为这样声明自己的东西:

C:\PROJECTS\>grep --version
grep (GNU grep) 2.4.2

Copyright 1988, 1992-1999, 2000 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

它为递归提供了以下选项:

-d, --directories=ACTION  how to handle directories
                          ACTION is 'read', 'recurse', or 'skip'.
-r, --recursive           equivalent to --directories=recurse.

但我无法让它返回文件夹内的文件的结果,因此grep -r fred *.txt只会在当前文件夹中找到包含“fred”的文件,而子文件夹中的文件将被忽略。

这里需要什么魔法选项?

回答下面是 Rich Homolka 的答案,但是这是我根据该答案开发的批处理包装器:

:==========================================================================
:   GrepExt - searches files matching an extension recursively for a string 
:
:   Usage   : call GrepExt <regex string to search for>  <extension>
:   Example : call GrepExt "procedure\ *Add" pas
:
:   Notes   : - quotes only needed if regex contains spaces
:             - remove the first "-i" for case-sensitive search 
:             - the second "-i" ensures the case of the extension doesn't matter     
:             - ErrorLevel set to 0 if there were any matches, 1 otherwise
:             - this is very inefficient when the folders contain a large
:               number of files that don't match the extension, as *all* files
:               are grepped and the results are then grepped to filter out
:               the hits from files that don't match the extension.         
:
@echo off
grep -i -r "%~1" . | grep -i "^[^:]*\.%~2:"

答案1

Grep 可能工作正常。你的命令就是错误所在。我之前回答过类似的问题这里关于 UNIX 上的 chown,使用 UNIX shell。其中一些解释可能有用。

如果您想使用递归标志进行检查,您需要传递一个目录:

grep -r fred .

这将在以 . 为根的任何文件中找到 fred,无论文件名称是否为 *.txt。

如果您想将其限制为仅名为 *.txt 的文件,您可以使用 grep 本身来执行此操作:

grep -r fred . | grep '^[^:]*\.txt:'

显然,每次输入都有点笨拙,但是却有效。

一种更干净的方法是使用 UNIX 风格的 shell(或者至少在命令提示符中执行起来太难了,我不知道如何这样做)。

在 unix 中,对于递归命令,通常使用模式

find file_selection_criteria | xargs command whatever_args

在这种情况下将是:

find . -name '*.txt' | xargs grep fred

更简单一点,如果你下载了较新的 shell 如 bash4 或 zsh,你就可以使用新的递归 glob(double *):

shopt -s globstar # needed for bash4
grep fred ./**/*.txt

所以这真的取决于你想做多少工作。如果你现在只想让 grep 工作,也许你会使用第一个,并过滤掉任何不叫 .txt 的东西。如果你经常这样做,也许花在获取类似 UNIX 的 shell 上的时间是值得的。你可以从赛格威或者使用一两个工具明网

答案2

您可以在循环find内使用本机命令for来达到相同目的:

for /r c:\users\administrator\desktop %a in (*) do @find /i /n "foo" %a

这里从目录开始,c:\users\administrator\desktop它将以递归方式 ( )在所有 ( ) 文件中/r搜索字符串(区分大小写 ( )),如果找到则显示它们的行号 ( )foo*/i/n

相关内容