快速查找以给定字符串开头的所有文件

快速查找以给定字符串开头的所有文件

我正在编写一个命令来查找损坏的 Cygwin 符号链接。

现在,我正在使用:

egrep -rnw . -e "^\!<symlink>"

但这不是很有效。我只关心文件是否以 开头!<symlink>,但grep会继续搜索文件的其余部分。

有什么方法可以通过内容前缀有效地搜索文件?

答案1

根据其他答案及其评论,

find . -type f -exec awk '/^!<symlink>/ {print FILENAME} {nextfile}' {} +

因为它使用-exec … +,所以它将执行awk尽可能少的次数(基于最大参数列表大小)。如果awk找到与正则表达式(即搜索字符串)匹配的行,它将打印文件名。 (如果将字符串放在单引号中,则不需要反斜杠 ( \)。)显然,如果您还想查看该行的内容,您可以说

{print FILENAME; print}

或者

{print FILENAME ": " $0}

然后,无条件地前进到下一个文件;因此它实际上只查看每个文件的第一行。注意:nextfile似乎没有定义POSIX;它可能只存在于 GNU 中awk

答案2

怎么样:

find . -type f -exec head -1v {} + | egrep -B 2 -nw -e "^\!<symlink>"

答案3

还建立在其他想法的基础上。

你想过吗xargs?它可以做一些并行化。

find . -type f -print0 | xargs -0 -P4 head -1 | egrep -wn "^\!<symlink>"

它的作用:查找所有常规文件并用“\0”而不是空格分隔文件列表。
我们指示 xargs 了解“\0”是分隔符并运行 4 个并发进程(根据您的核心数量和磁盘速度进行调整)。 Xargs 将对每个文件运行 head 命令。
最后用你的模式来查询结果。

头部仍将运行充足的时间。但同时!除非您需要进行这种定期搜索,否则我不会费心尝试进一步优化它。如果无论如何只运行一次,则更快的运行时间不会获得更多优化所花费的时间。

相关内容