尝试查找find命令的结果文件名中包含的单词/模式。
例如,我有这个命令:
find . -name Gruntfile.js
返回多个文件名。
如何在这些内容中使用单词格式?
正在思考以下几点:
find . -name Gruntfile.js | grep -rnw -e 'purifycss'
但是,这不起作用..
答案 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
希望这会有所帮助。