如何让find命令找到第一个匹配文件后停止搜索
解决find找到第一个匹配文件后终止搜索的问题
方法1:用find结合head -n1
原命令的逻辑存在优先级问题,-o需要用括号包裹,否则会出现不符合预期的匹配结果。加上管道到head -n1后,当head读取到第一行结果就会退出,此时find的输出管道被关闭,会收到SIGPIPE信号自动终止后续搜索,无需额外操作。
执行命令:
find /media/pk/mm2020A1/00.staging /media/pk/mm2020A1/x.folders \( -name '*hevc*' -o -name '*HEVC*' -o -name '*265*' \) | head -n1
方法2:在Perl脚本中调用find并控制终止
通过open执行find命令,读取第一行匹配结果后立即关闭文件句柄,find进程会因管道关闭而终止。
示例代码:
open my $find_fh, "-|", "find /media/pk/mm2020A1/00.staging /media/pk/mm2020A1/x.folders \\( -name '*hevc*' -o -name '*HEVC*' -o -name '*265*' \\)" or die $!; if (my $first_match = <$find_fh>) { chomp $first_match; print "找到第一个匹配文件:$first_match\n"; close $find_fh; }
方法3:用Perl的File::Find模块自行遍历
直接用Perl的目录遍历模块,找到第一个匹配文件后立即终止遍历,完全可控。
示例代码:
use File::Find; my $found_file; find(sub { return if $found_file; # 匹配文件名包含hevc(不区分大小写)或265 if (/hevc/i || /265/) { $found_file = $File::Find::name; print "找到第一个匹配文件:$found_file\n"; die; # 终止find的遍历进程 } }, "/media/pk/mm2020A1/00.staging", "/media/pk/mm2020A1/x.folders");
补充说明
- 你之前尝试的
-exec exit;无效,是因为exit是在子进程中执行,只会终止子进程,不会影响find主进程。 prune仅用于跳过指定子目录,无法终止整个搜索流程。
内容的提问来源于stack exchange,提问作者pkrauss6171
相关产品推荐
相关产品推荐

