你如何 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
希望对您有所帮助。
正在尝试查找包含在查找命令的结果文件名中的 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
希望对您有所帮助。