在Windows中,如果我想在所有子目录中的所有文件中找到一个字符串,我会做类似的事情
findstr /C:"the string" /S *.h
但是,在Linux(例如,Ubuntu)中,除了找到涉及,和的管道命令外find
,我别无其他方法(此页为示例:如何通过子目录递归grep?)。但是,我的问题就不同了:是否有任何内置命令可以通过这种魔术工作而无需编写我的shell脚本?xargs
grep
在Windows中,如果我想在所有子目录中的所有文件中找到一个字符串,我会做类似的事情
findstr /C:"the string" /S *.h
但是,在Linux(例如,Ubuntu)中,除了找到涉及,和的管道命令外find
,我别无其他方法(此页为示例:如何通过子目录递归grep?)。但是,我的问题就不同了:是否有任何内置命令可以通过这种魔术工作而无需编写我的shell脚本?xargs
grep
Answers:
GNU grep允许递归搜索子目录:
grep -r --include='*.h' 'the string' .
-Msomething
或GREP_OPTIONS
设置引起的。
不 find -name \*.h -print0 | xargs -0 grep -l 'the regex'
,它具有魔力。
-r
选项。无需重型火炮。
xargs
只会增加噪音。使用find -name \*.h -execdir grep -l 'the regex {} +
是否有任何单个内置命令可通过此魔术起作用...?
要学究,不,您不能假设存在这样的命令。
Unix有许多不同的实现,每个都有其不同的怪癖。POSIX(公共分母(并且是Unices中最接近标准的东西))没有为指定该选项grep
。
正如其他答案中提到的那样,GNU的实现grep
有一个非标准的选项可以满足您的需求。尽管此特定实现在Linux系统上可能很常见,但是您不能假设它在任何Unix(甚至某些Linux系统)上都可用。
最后,我要指出的是,Unix的哲学是主张将多个原始程序组合起来,而不是使用试图立即完成所有操作的大型整体可执行文件。
在您的情况下,对文件系统进行爬网和在流中匹配正则表达式是两个单独的任务。仅在单独的程序中处理它们是正常的。
要从给定目录中查找字符串,请使用以下命令
find <fullDirectoryPath> -name '*' -exec grep -l '<StringToFind>' {} \;
例如:
find /apps_bev/apps/xfer/export/02210 -name '*' -exec grep -l '38221000001032' {} \;
grep
可以使用多个文件作为参数,因此您应该使用+
而不是\;
避免对grep
每个文件运行一个调用,这效率很低。
-name '*'
仅限于在当前语言环境中名称为有效文本的文件(find
至少在某些实现中),但是其他目录组件可能仍包含不构成有效字符的字节序列。如果这样做的目的-name '*'
是确保输出是有效的文本(通过省略名称不正确的文件),则宁愿使用find ... ! -name '*' -prune -o -exec grep ... {} +
,它也可以停止find
使用名称不正确的目录。