Answers:
您可以find
通过head
以下管道传递输出:
find . -name '*.txt' | head -n 3
head
启动并等待管道左侧的输入。然后find
启动并搜索符合指定条件的文件,并通过管道发送其输出。当head
已经接收和打印请求的行数,它终止,关闭所述管道。find
注意封闭的管道,它也终止。简单,优雅,高效。
这个其他答案有些瑕疵。该命令是
find . -name '*.txt' | head -n 3
然后其中一个评论有一个解释[强调我的]:
head
启动并等待管道左侧的输入。然后find
启动并搜索符合指定条件的文件,并通过管道发送其输出。当head
已经接收和打印请求的行数,它终止,关闭所述管道。find
注意封闭的管道,它也终止。简单,优雅,高效。
这几乎是真的。
问题是find
仅在试图写入封闭管道时才注意到封闭管道–在这种情况下,这是找到第4个匹配项的时候。但是,如果没有第4场比赛,那么比赛find
将继续。您的外壳将等待!如果它发生在脚本中,则脚本将等待,尽管事实上我们已经知道管道输出是最终的,并且无法对其进行任何添加。不太有效。
如果此find
命令本身快速完成,但是在大型文件树中进行复杂的搜索时,该命令可能会不必要地延迟您接下来要执行的操作,因此可以忽略不计。
不太完美的解决方案要运行
( find … & ) | head -n 3
这样,head
退出时,shell将立即继续。find
然后,可以忽略后台进程(迟早会退出)或使用pkill
或其他东西作为。
为了证明这一概念,您可以搜索/
。我们只希望一场比赛,但是find
到处寻找它,可能会花费很多时间。
find / -wholename / 2>/dev/null | head -n 1
看到问题后,立即用Ctrl+ 终止C。现在比较:
pidof find ; ( find / -wholename / 2>/dev/null & ) | head -n 1 ; pidof find
find . -name '*.txt' -print -quit
显示第一个匹配项,并find
在第一个匹配项后退出。我不知道是否有可能适应“找到n个匹配项后退出”的情况。