如何简化find命令中多目录排除的编写方式?
简化find命令中多路径排除的写法
当然可以!针对你这种需要排除大量重复模式目录的场景,有好几种简洁的优化方式,咱们一步步来看:
方案1:用通配符合并重复排除规则
观察你要排除的路径,852到859是连续编号,完全可以用范围通配符把这8条-not -path规则合并成一条,再保留86*的排除规则,命令瞬间简洁很多:
find ./8*/dti_processed/dti_FA.nii.gz \ -not -path "./86*/*" \ -not -path "./85[2-9]/*"
这里85[2-9]会精准匹配852到859之间的所有目录,完美替代原来的8条重复规则。
方案2:用-prune优化排除逻辑(更高效)
如果后续要排除的目录越来越多,用-prune可以让find直接跳过不需要遍历的目录,比多次-not -path的效率更高,写法如下:
find . -type d \( -name "86*" -o -name "85[2-9]" \) -prune \ -o -path "./8*/dti_processed/dti_FA.nii.gz" -print
简单解释下逻辑:
- 先匹配所有需要排除的目录(
86*和852-859),用-prune跳过对这些目录的遍历 - 再用
-o(逻辑或)匹配你要找的目标文件,最后-print输出结果
方案3:批量管理排除列表(适合大量不连续目录)
如果未来要排除的目录列表很长且编号不连续,你可以把这些目录名写到一个文本文件里,比如exclude_dirs.txt:
86* 852 853 854 855 856 857 858 859
然后用printf配合find批量生成排除规则:
find ./8*/dti_processed/dti_FA.nii.gz \ $(printf "-not -path './%s/*' " $(cat exclude_dirs.txt))
这样后续只需要修改exclude_dirs.txt就能更新排除列表,不用频繁调整find命令本身,维护起来更省心。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

