你怎么从'发现'中得到结果?

时间:2015-06-15 13:02:45

标签: bash terminal grep find

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

例如,我有这个命令:

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

如何在这些内容中使用单词格式?

正在思考以下几点:

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

但是,这不起作用..

3 个答案:

答案 0 :(得分:6)

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

find -name Gruntfile.js -exec grep -nw 'purifycss' {} +

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

我已移除了-e-r个开关,因为我不认为它们对您有用。

答案 1 :(得分:2)

虽然这并没有严格回答你的问题,但如果你打开了globstar(shopt -s globstar),你可以用bash过滤结果:

grep something **/Gruntfile.js

我正在使用Tom Fenech使用的方法,直到我切换到zsh,它更好地处理很多这样的事情。现在我所做的就是:

grep text **/*(.)

通过当前目录中的所有常规文件来搜索文本。

我认为这是更清晰的语法,特别是对于shell中的日常工作。

答案 2 :(得分:0)

如果存在太多文件而无法运行*扩展:

$ grep -o 'xxmaj\|xxbos\|xxfld' train/* | wc -l
-bash: /bin/grep: Argument list too long
0

然后此代码解决了“过长”的问题:

$ 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选项时,它在我的系统(可能是您的系统)上运行更快:

$ /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

希望这会有所帮助。