我正在编写一个命令来查找损坏的 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 命令。
最后用你的模式来查询结果。
头部仍将运行充足的时间。但同时!除非您需要进行这种定期搜索,否则我不会费心尝试进一步优化它。如果无论如何只运行一次,则更快的运行时间不会获得更多优化所花费的时间。