我的 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