我想(递归地)列出目录中第二行完全匹配某个正则表达式的所有文件。文件总数约为60K。
到目前为止,我编写了这个命令:
find /path -type f | xargs --no-run-if-empty -n1000 awk 'FNR = 2 && $0 ~ /^regular expression$/ {print FILENAME; nextfile}'
。
能否提高效率?
答案1
首先要注意你错误地使用了=
而不是正确的==
。
你不需要xargs
,你可以直接运行find
。另外,您awk
应该在处理完第 2 行后立即退出,而不是读取整个文件。
find /path -type f -exec awk 'FNR == 2 && /^regular expression$/ {print FILENAME}; FNR == 2 {nextfile}' '{}' +
参数末尾+
的-exec
指示find
放置尽可能多的文件名参数。啦啦xargs
。看find
文档。
这里重要的一点是FNR==2 {nextfile}
。
是否-exec
优于xargs
(但使用-print0
&-0
如果可用)有待讨论。一方面,find … | xargs …
允许在检查前一批find
的同时读取更多文件名,从而实现一定程度的并行化。awk
另一方面,并行化可能会导致坏磁盘与awk
磁盘find
的不同磁道相互竞争。您的硬件(缓存大小、SSD 等)将改变这一情况。配置文件然后决定。
答案2
你可以尝试:
grep -n <reg expr> /path/to/* | grep ":2:" | cut -d ':' -f1
只要:2:
不是 的一部分<reg expr>
。
还有-x
整线匹配。
不知道这是否更快 - 我没有 60k 个文件来测试:]