试图在find命令的结果文件名中找到包含的单词/模式。
例如,我有一个命令:
返回多个文件名的find . -name Gruntfile.js。
我如何在这些中实现单词模式的grep呢?
他在思考这样的问题:
find . -name Gruntfile.js | grep -rnw -e 'purifycss'
不过,这不管用..。
发布于 2015-06-15 13:04:48
使用-exec {} +选项将作为参数找到的文件名列表传递给grep:
find -name Gruntfile.js -exec grep -nw 'purifycss' {} +这是最安全和最有效的方法,因为当文件的路径不是“良好行为”(例如包含一个空格)时,它不会中断。就像使用xargs的方法一样,它还通过一次传递多个文件名来最小化对grep的调用次数。
我已经删除了-e和-r开关,因为我认为它们在这里对您没有用处。
摘录自man find
-exec command {} +-exec操作的这个变体在选定的文件上运行指定的命令,但是命令行是通过在末尾追加每个选定的文件名来构建的;命令的调用总数将比匹配的文件数少得多。
发布于 2015-06-15 13:22:06
虽然这并不能严格回答您的问题,但只要您打开了全球之星(shopt -s globstar),就可以像这样在bash中过滤结果:
grep something **/Gruntfile.js我一直在虔诚地使用汤姆·费内赫的方法,直到我转到zsh,它能更好地处理这些事情。现在我所做的就是:
grep text **/*(.)它通过当前目录中的所有常规文件显示文本。
我相信这是一个更清晰的语法,尤其是在shell中的日常工作中。
发布于 2018-12-05 17:59:08
当存在太多文件使*展开无法运行时:
$ 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希望这能有所帮助。
https://stackoverflow.com/questions/30845895
复制相似问题