我想知道是否有任何方法可以根据另一个程序的输出或退出代码在 find(1) 的结果中包含或排除文件。具体来说,我希望能够运行 find(1),以便它仅返回那些包含正则表达式正则匹配项的文件。
我意识到这可以通过 egrep 管道传输 find(1) 的输出来实现,但我希望能够在 find(1) 内部完成所有操作。
例如,有没有办法将以下内容转换为不使用任何管道的 find(1) 单次调用?
find . [test] | xargs egrep -l [regex]
答案1
-exec
如果命令返回零(成功),则计算结果为“true”:
find . -type f -exec egrep -qs "regex" {} \; -print
-print
用您选择的动作替换。
然而,考虑到这种方式egrep
只执行一次每个文件。 比较:
平等〜/代码$时间找到-类型f-exec grep-qs bin/env {} \; -print | wc -l 60 实际 0分0.760秒 用户 0分0.104秒 系统 0分0.596秒
对阵
相等〜/代码$时间查找-type f -print0 | xargs -0 egrep -l bin / env | wc -l 60 实际 0分0.021秒 用户 0分0.003秒 系统 0分0.023秒
(在一个相当小的 Git 存储库上测试,300 个文件,约 2.6 MB。)