仅使用查找来查找前几个匹配的文件?


17

假设*.txt目录中可能有数百个文件。我只想找到前三个*.txt文件,然后退出搜索过程。

如何使用find实用程序实现这一目标?我快速浏览了它的手册页,似乎不是这样的选择。


3
您只能使用find . -name '*.txt' -print -quit显示第一个匹配项,并find在第一个匹配项后退出。我不知道是否有可能适应“找到n个匹配项后退出”的情况。
NN

Answers:


22

您可以find通过head以下管道传递输出:

find . -name '*.txt' | head -n 3

2
我知道这一点,我想在找到前三个匹配文件后退出搜索过程。可能有大量我不在乎的匹配文件。
mitnk 2013年

2
我认为一旦head打印了前3个文件,find命令便会终止
Chris Card

1
是的,很奇怪,但是你是对的。
mitnk 2013年

19
这一点都不奇怪-它是UNIX中管道的工作方式。head启动并等待管道左侧的输入。然后find启动并搜索符合指定条件的文件,并通过管道发送其输出。当head已经接收和打印请求的行数,它终止,关闭所述管道。find注意封闭的管道,它也终止。简单,优雅,高效。
D_Bye

3
总而言之,-n 3它与POSIX兼容,因此可能更易于移植。
l0b0

4

这个其他答案有些瑕疵。该命令是

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.