使用 find 只找到前几个匹配的文件?

mit*_*tnk 21 find

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

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

Chr*_*ard 29

你可以find通过管道输出head

find . -name '*.txt' | head -n 3
Run Code Online (Sandbox Code Playgroud)

  • 这一点都不奇怪——这就是管道在 UNIX 中的工作方式。`head` 启动并等待来自管道左侧的输入。然后`find` 启动并搜索符合指定条件的文件,并通过管道发送其输出。当 head 接收并打印请求的行数时,它会终止并关闭管道。`find` 注意到关闭的管道,它也终止了。简单、优雅、高效。 (23认同)
  • 我知道这一点,我想在找到前三个匹配的文件后退出搜索过程。可能有大量我不在乎的匹配文件。 (3认同)
  • 我认为一旦 head 打印了前 3 个文件, find 命令就会终止 (3认同)
  • 总而言之,`-n 3` 是 [POSIX 兼容](http://www.unix.com/man-page/POSIX/1/head/),因此可能更便携。 (3认同)
  • 是的,这很奇怪,但你是对的。 (2认同)

Kam*_*ski 8

这个另一个答案有些缺陷。命令是

find . -name '*.txt' | head -n 3
Run Code Online (Sandbox Code Playgroud)

然后在其中一条评论[强调我的]中有一个解释:

head启动并等待来自管道左侧的输入。然后find启动并搜索与指定条件匹配的文件,通过管道发送其输出。当head收到并打印请求的行数时,它终止并关闭管道。find注意到关闭的管道,它也终止了。简单、优雅、高效

几乎是真的。

问题是find只有当它尝试写入时才会注意到关闭的管道——在这种情况下,它是在找到第 4 个匹配时。但如果没有第 4 场比赛,那么find将继续。你的外壳会等待!如果它发生在脚本中,脚本将等待,尽管我们已经知道管道输出是最终的,并且无法向其中添加任何内容。效率不高。

如果此特定程序find自行快速完成,但在大型文件树中进行复杂搜索,则该命令可能会不必要地延迟您接下来想要执行的任何操作,则效果可以忽略不计。

不太完美的解决方案是运行

( find … & ) | head -n 3
Run Code Online (Sandbox Code Playgroud)

这样当head退出时,shell 会立即继续。后台find进程可能会被忽略(它迟早会退出)或针对pkill某个东西。


为了证明您可以搜索的概念/。我们只期待一场比赛,但find到处寻找,可能需要很多时间。

find / -wholename / 2>/dev/null | head -n 1
Run Code Online (Sandbox Code Playgroud)

看到问题后立即用Ctrl+终止它C。现在比较:

pidof find ; ( find / -wholename / 2>/dev/null & ) | head -n 1 ; pidof find
Run Code Online (Sandbox Code Playgroud)