首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你的grep是如何从“发现”中得到的?

你的grep是如何从“发现”中得到的?
EN

Stack Overflow用户
提问于 2015-06-15 13:02:45
回答 3查看 9.2K关注 0票数 8

试图在find命令的结果文件名中找到包含的单词/模式。

例如,我有一个命令:

返回多个文件名的find . -name Gruntfile.js

我如何在这些中实现单词模式的grep呢?

他在思考这样的问题:

find . -name Gruntfile.js | grep -rnw -e 'purifycss'

不过,这不管用..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-15 13:04:48

使用-exec {} +选项将作为参数找到的文件名列表传递给grep:

代码语言:javascript
复制
find -name Gruntfile.js -exec grep -nw 'purifycss' {} +

这是最安全和最有效的方法,因为当文件的路径不是“良好行为”(例如包含一个空格)时,它不会中断。就像使用xargs的方法一样,它还通过一次传递多个文件名来最小化对grep的调用次数。

我已经删除了-e-r开关,因为我认为它们在这里对您没有用处。

摘录自man find

-exec command {} + -exec操作的这个变体在选定的文件上运行指定的命令,但是命令行是通过在末尾追加每个选定的文件名来构建的;命令的调用总数将比匹配的文件数少得多。

票数 15
EN

Stack Overflow用户

发布于 2015-06-15 13:22:06

虽然这并不能严格回答您的问题,但只要您打开了全球之星(shopt -s globstar),就可以像这样在bash中过滤结果:

代码语言:javascript
复制
grep something **/Gruntfile.js

我一直在虔诚地使用汤姆·费内赫的方法,直到我转到zsh,它能更好地处理这些事情。现在我所做的就是:

代码语言:javascript
复制
grep text **/*(.)

它通过当前目录中的所有常规文件显示文本。

我相信这是一个更清晰的语法,尤其是在shell中的日常工作中。

票数 2
EN

Stack Overflow用户

发布于 2018-12-05 17:59:08

当存在太多文件使*展开无法运行时:

代码语言:javascript
复制
$ grep -o 'xxmaj\|xxbos\|xxfld' train/* | wc -l
-bash: /bin/grep: Argument list too long
0

然后,这段代码修复了“太长”的问题:

代码语言:javascript
复制
$ find junk -maxdepth 1 -type f | xargs grep -o 'TVDetails\|xxmaj\|xxbos\|xxfld' 
junk/gum-.doc.out:TVDetails
junk/Zv0n.doc.out:TVDetails
$ find junk -maxdepth 1 -type f | xargs grep -o 'TVDetails\|xxmaj\|xxbos\|xxfld' | wc -l
2

当使用-P 0选项时,它在我的系统上运行得更快,也许在您的系统上运行得更快:

代码语言:javascript
复制
$ /usr/bin/time -f "%E Elapsed Real Time" find train -maxdepth 1 -type f | xargs -P 0 grep -o 'TVDetails\|xxmaj\|xxbos\|xxfld' | wc -l
0:02.45 Elapsed Real Time
358
$ /usr/bin/time -f "%E Elapsed Real Time" find train -maxdepth 1 -type f | xargs grep -o 'TVDetails\|xxmaj\|xxbos\|xxfld' | wc -l
0:11.96 Elapsed Real Time
358

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30845895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档