使用单个内置命令在跨子目录的文件中查找子字符串?


10

在Windows中,如果我想在所有子目录中的所有文件中找到一个字符串,我会做类似的事情

findstr /C:"the string" /S *.h

但是,在Linux(例如,Ubuntu)中,除了找到涉及,和的管道命令外find,我别无其他方法(此页为示例:如何通过子目录递归grep?)。但是,我的问题就不同了:是否有任何内置命令可以通过这种魔术工作而无需编写我的shell脚本?xargsgrep

Answers:


19

GNU grep允许递归搜索子目录:

grep -r --include='*.h' 'the string' .

我在Ubuntu中尝试了这个确切的命令行,但是得到了“ grep:无效选项-'M'”,尽管我在任何地方都看不到任何“ M”……令人费解
Guido Domenici

@Guido在这里工作很好
phunehehe 2011年

建议的修改中, TomasG建议将最后一个更改*'*':“如果某些文件名以-开头,则需要引用最后一个通配符以避免错误。”
Michael Mrozek

就像在原始答案中输入的那样,在一件奇怪的事情中,它现在也对我有用。谢谢!
Guido Domenici

1
@Guido:您的问题可能是由于当前目录中的文件-MsomethingGREP_OPTIONS设置引起的。
吉尔(Gilles)'所以

2

grep -r searchpattern /path/to/start/in

在哪里/path/to/start/in/可以只是“ .”为当前目录。



0

是否有任何单个内置命令可通过此魔术起作用...?

要学究,不,您不能假设存在这样的命令

Unix有许多不同的实现,每个都有其不同的怪癖。POSIX(公共分母(并且是Unices中最接近标准的东西))没有为指定该选项grep

正如其他答案中提到的那样,GNU的实现grep有一个非标准的选项可以满足您的需求。尽管此特定实现在Linux系统上可能很常见,但是您不能假设它在任何Unix(甚至某些Linux系统)上都可用。

最后,我要指出的是,Unix的哲学是主张将多个原始程序组合起来,而不是使用试图立即完成所有操作的大型整体可执行文件。

在您的情况下,对文件系统进行爬网和在流中匹配正则表达式是两个单独的任务。仅在单独的程序中处理它们是正常的。


0

要从给定目录中查找字符串,请使用以下命令

find <fullDirectoryPath> -name '*' -exec grep -l '<StringToFind>' {} \;

例如:

find /apps_bev/apps/xfer/export/02210 -name '*' -exec grep -l '38221000001032' {} \;

1
grep可以使用多个文件作为参数,因此您应该使用+而不是\;避免对grep每个文件运行一个调用,这效率很低。
斯蒂芬·查泽拉斯

1
请注意,-name '*'仅限于在当前语言环境中名称为有效文本的文件(find至少在某些实现中),但是其他目录组件可能仍包含不构成有效字符的字节序列。如果这样做的目的-name '*'是确保输出是有效的文本(通过省略名称不正确的文件),则宁愿使用find ... ! -name '*' -prune -o -exec grep ... {} +,它也可以停止find使用名称不正确的目录。
斯特凡·查泽拉斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.