Bash find命令如何查找指定目录下exr、dpx文件并排除含BTY的文件
find 命令逻辑修正方案
原命令的核心问题
你之前写的命令达不到预期,核心是两个设计错误:
- 逻辑优先级没做分组:find 里的
-o是“或”逻辑,平级从左到右判定,没加括号绑定条件的话,三个判定项是完全独立的,根本拼不出“先筛指定后缀、再排除带BTY文件”的嵌套逻辑 - 排除逻辑完全写偏:你把排除条件当成第三个独立的“或”分支,既没覆盖dpx格式里BTY文件的排除需求,还错把“不是普通文件”当成分支判定项,等于排除动作完全没生效
拆解开原命令的实际判定逻辑就是:
匹配满足以下任意一个条件的对象:
- 是普通文件、后缀为
.dpx- 是普通文件、后缀为
.exr- 不是普通文件、后缀为
.exr、文件名包含BTY
这个逻辑和你“筛dpx/exr普通文件、排除带BTY的文件”的需求完全偏离,自然出不来正确结果。
可直接执行的正确命令
macOS 系统适配版本(匹配你当前的用户路径环境)
find /Users/Tim/Downloads -type f \( -name "*.dpx" -o -name "*.exr" \) ! -name "*BTY*"
注意:命令里的括号
()必须加反斜杠转义,否则会被shell当成脚本块解析报错。
命令逻辑拆解
-type f:只筛选普通文件,跳过目录、符号链接、设备文件等非文件对象\( -name "*.dpx" -o -name "*.exr" \):通过转义括号把两个“匹配指定后缀”的条件绑定为一个独立判定组,从根源上避免逻辑优先级混乱! -name "*BTY*":在前面筛选出的dpx/exr文件集合里,排除所有文件名包含BTY的对象,同时覆盖两种格式的排除需求
可选调整方案
如果实际场景里的BTY大小写不固定(比如存在小写bty、混合大小写Bty的情况),可以把匹配后缀的-name替换为不区分大小写的-iname,调整后的命令为:find /Users/Tim/Downloads -type f \( -iname "*.dpx" -o -iname "*.exr" \) ! -iname "*BTY*"
内容的提问来源于stack exchange,提问作者user11804258
相关产品推荐
相关产品推荐

