linux中用find排除指定目录的核心是-prune选项,它阻止进入匹配目录递归搜索而非仅跳过结果;必须配合-path精确完整路径、-o逻辑或及-print输出,多目录可用括号分组或链式-o实现。

Linux 中用 find 排除指定目录,核心靠 -prune 选项,它不是简单“跳过匹配结果”,而是阻止进入该目录递归搜索——这才是高效排除的关键。
单个目录排除:基础写法必须带 -o
命令结构固定为:find [搜索路径] -path "[要排除的完整路径]" -prune -o [其他条件] -print
-
-path必须写**完整、精确的路径**(如./node_modules或/home/user/Downloads),不能只写目录名 -
-prune后必须紧跟-o(逻辑“或”),否则 find 会把-prune当作最终动作,不再执行后续条件 - 常见错误:漏掉
-o,导致什么也查不到;路径写错(比如少斜杠、大小写不符)
示例:在当前目录找所有 .js 文件,但不进 node_modulesfind . -path "./node_modules" -prune -o -name "*.js" -print
多个目录排除:用括号分组或链式 -o
两种写法都有效,推荐括号写法更清晰:
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 括号分组(需转义):
find . \( -path "./node_modules" -o -path "./dist" -o -path "./.git" \) -prune -o -name "*.log" -print - 链式
-o(等价但稍长):find . -path "./node_modules" -prune -o -path "./dist" -prune -o -path "./.git" -prune -o -name "*.log" -print
注意:括号前后必须有空格,且用反斜杠 \( 和 \) 转义,否则 shell 会报错
排除含通配符的路径(如所有以 cache 结尾的目录)
用 -path 配合通配符,再加 -prune:
- 排除所有名为
cache的子目录:find . -path "*/cache" -prune -o -name "*.conf" -print - 排除所有含
temp的路径(包括子路径):find . -path "*temp*" -prune -o -name "*.sh" -print
原理:-path 匹配的是整个路径字符串,所以 "*/cache" 能命中 ./a/cache、./project/cache 等,但不会误伤 ./caches
只排除目录本身,仍搜索其下的文件?不行——-prune 就是防递归
有人误以为 -prune 只“不显示目录”,其实它真正作用是:一旦匹配到该路径,就跳过整个子树,完全不遍历里面任何内容。
- 想跳过某个目录但继续搜它的同级文件?没问题,
-prune正是干这个的 - 想保留该目录,只跳过它里面的某些文件?那就别用
-prune,改用! -name或-not -path过滤结果 - 例如:搜所有
.txt,但不要logs/下的 —— 就该用-prune;如果只是不要叫error.txt的文件,用! -name "error.txt"更直接










