假设*.txt
一个目录中可能有数百个文件。我只想找到前三个*.txt
文件,然后退出搜索过程。
如何使用该find
实用程序实现这一目标?我快速浏览了它的手册页,似乎不是这样的选择。
Chr*_*ard 29
你可以find
通过管道输出head
:
find . -name '*.txt' | head -n 3
Run Code Online (Sandbox Code Playgroud)
这个另一个答案有些缺陷。命令是
Run Code Online (Sandbox Code Playgroud)find . -name '*.txt' | head -n 3
然后在其中一条评论[强调我的]中有一个解释:
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)