你如何 grep 来自 'find' 的结果?

How do you grep results from 'find'?

正在尝试查找包含在查找命令的结果文件名中的 word/pattern。

例如,我有这个命令:

find . -name Gruntfile.js即returns几个文件名。

如何在其中 grep 查找单词模式?

正在考虑以下内容:

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

然而,这是行不通的..

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

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

这是最安全、最有效的方法,因为当文件路径不“正常”(例如包含 space)时它不会中断。与使用 xargs 的方法一样,它还通过一次传递多个文件名来最大程度地减少对 grep 的调用次数。

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


摘自man find

-exec command {} +
This variant of the -exec action runs the specified command on the selected files, but the command line is built by appending each selected file name at the end; the total number of invocations of the command will be much less than the number of matched files.

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

grep something **/Gruntfile.js

在我切换到 zsh 之前,我一直虔诚地使用 Tom Fenech 使用的方法,它可以更好地处理此类事情 。现在我所做的就是:

grep text **/*(.)

通过当前目录中的所有常规文件对文本进行 greps。

我相信这是更简洁的语法,尤其是对于 shell 中的日常工作。

当存在太多文件无法扩展到 运行:

$ 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

希望对您有所帮助。