使用find命令实现复杂AND/OR字符串搜索的问题
解决find命令筛选多媒体文件并排除预告片的问题
嘿,我懂你的困扰——这其实是find命令里逻辑运算符优先级挖的坑!你原来的命令里,因为-or的优先级比默认的-and低,导致排除-trailer的条件只绑定到了最后一个文件格式规则上,所以带-trailer的mkv/mp4文件还是会被前面的规则匹配到,根本没被排除。
给你两个靠谱的解决方案:
方案1:用括号分组格式匹配条件
这是最通用、兼容性最好的写法,核心是把所有格式匹配的条件用括号括起来,确保它们作为一个整体和排除条件做逻辑与:
find . -type f \( -iname '*.mkv' -o -iname '*.mp4' -o -iname '*.avi' \) ! -iname '*-trailer*'
拆解一下各部分的作用:
\( ... \):转义括号(因为shell会把未转义的括号当作命令分组解析),把三个格式匹配规则打包成一个整体,确保-type f先和这个整体做“与”运算-o:就是你用的-or的简写,作用完全一样! -iname '*-trailer*':表示排除所有文件名中包含-trailer片段的文件,不区分大小写
方案2:用正则表达式简化格式匹配
如果你觉得括号写法有点繁琐,可以用-iregex(不区分大小写的正则匹配)来一次性指定所有目标格式:
find . -type f -iregex '.*\.\(mkv\|mp4\|avi\)$' ! -iname '*-trailer*'
这里的正则.*\.\(mkv\|mp4\|avi\)$表示:匹配任意字符结尾是.mkv、.mp4或.avi的文件,同样搭配排除条件就能过滤掉预告片。
记得测试一下命令,比如你可以先加-print参数(其实默认就会打印),看看结果是不是符合预期~
内容的提问来源于stack exchange,提问作者Jeff Arnholt
相关产品推荐
相关产品推荐

