如何递归地grep所有目录和子目录?
find . | xargs grep "texthere" *
如何递归地grep所有目录和子目录?
find . | xargs grep "texthere" *
当前回答
ag是我现在最喜欢的实现方式github.com/ggreer/the_silver_searcher。它基本上与ack相同,但还有一些优化。
这是一个简短的基准。我在每次测试前清除缓存(cfhttps://askubuntu.com/questions/155768/how-do-i-clean-or-disable-the-memory-cache )
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time grep -r "hey ya" .
real 0m9.458s
user 0m0.368s
sys 0m3.788s
ryan@3G08:$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ack-grep "hey ya" .
real 0m6.296s
user 0m0.716s
sys 0m1.056s
ryan@3G08$ sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
3
ryan@3G08$ time ag "hey ya" .
real 0m5.641s
user 0m0.356s
sys 0m3.444s
ryan@3G08$ time ag "hey ya" . #test without first clearing cache
real 0m0.154s
user 0m0.224s
sys 0m0.172s
其他回答
我现在总是使用(即使在Windows上使用GoW-Gnu):
grep --include="*.xxx" -nRHI "my Text to grep" *
(正如kronen在评论中指出的,您可以添加2>/dev/null以使拒绝权限的输出无效)
其中包括以下选项:
--include=PATTERN
仅在目录中重复搜索与PATTERN匹配的文件。
-n, --line-number
在输出的每一行前面加上输入文件中的行号。
(注意:phuclv在注释中补充道,-n会大大降低性能,因此您可能希望跳过该选项)
-R, -r, --recursive
递归地读取每个目录下的所有文件;这相当于-d递归选项。
-H, --with-filename
打印每个匹配项的文件名。
-I
处理二进制文件,就像它不包含匹配的数据一样;这相当于--binary files=不匹配选项。
如果我想要不区分大小写的结果,我可以添加“I”(-nRHIi)。
我可以得到:
/home/vonc/gitpoc/passenger/gitlist/github #grep --include="*.php" -nRHI "hidden" *
src/GitList/Application.php:43: 'git.hidden' => $config->get('git', 'hidden') ? $config->get('git', 'hidden') : array(),
src/GitList/Provider/GitServiceProvider.php:21: $options['hidden'] = $app['git.hidden'];
tests/InterfaceTest.php:32: $options['hidden'] = array(self::$tmpdir . '/hiddenrepo');
vendor/klaussilveira/gitter/lib/Gitter/Client.php:20: protected $hidden;
vendor/klaussilveira/gitter/lib/Gitter/Client.php:170: * Get hidden repository list
vendor/klaussilveira/gitter/lib/Gitter/Client.php:176: return $this->hidden;
...
grep -r "texthere" .
第一个参数表示要搜索的正则表达式,而第二个参数表示应该搜索的目录。在这种情况下。表示当前目录。
注意:这适用于GNUgrep,在某些平台(如Solaris)上,您必须特别使用GNUgrep而不是传统实现。对于Solaris,这是ggrep命令。
要查找路径递归包含特定字符串的文件名,请使用以下命令对于UNIX:
find . | xargs grep "searched-string"
对于Linux:
grep -r "searched-string" .
在UNIX服务器上查找文件
find . -type f -name file_name
在LINUX服务器上查找文件
find . -name file_name
有关可用标志的列表:
grep --help
返回当前目录中此处的regexp文本的所有匹配项,以及相应的行号:
grep -rn "texthere" .
返回文本的所有匹配项,从根目录开始,具有相应的行号,忽略大小写:
grep -rni "texthere" /
此处使用的标志:
-r递归-n带输出的打印行号-我不理这个案子
如果您正在从目录结构中查找所有文件中的特定内容,您可以使用find,因为它更清楚您在做什么:
find -type f -exec grep -l "texthere" {} +
注意,-l(l的小写)显示包含文本的文件的名称。如果要打印匹配项本身,请将其删除。或者使用-H将文件与匹配项一起获取。总之,其他备选方案包括:
find -type f -exec grep -Hn "texthere" {} +
其中-n打印行号。