linux find 排除
时间: 2025-01-08 10:50:10 浏览: 4
### 使用 `find` 命令排除指定文件或目录
#### 排除特定目录
为了在查找过程中排除某个特定的目录及其子目录,在 `find` 命令中可以使用 `-path` 或者更常用的 `-prune` 关键字。例如,要忽略名为 `gmp` 的目录并仅搜索 `.log` 文件:
```bash
find . -path "./gmp" -prune -o -name "*.log" -print
```
这条指令会遍历当前路径下的所有项,当遇到路径匹配 `"./gmp"` 时停止进一步深入该分支(`-prune`);对于其他不被排除的位置,则继续检查是否满足名称模式为 `*.log` 并打印出来[^1]。
#### 排除多种类型的文件
若希望过滤掉几种不同扩展名的文件而保留其余部分,可借助逻辑运算符组合多个条件实现这一目标。比如想要跳过 Python 脚本 (`*.py`) 和 Shell 脚本 (`*.sh`) 文件的话:
```bash
find . -type f ! \( -name "*.py" -o -name "*.sh" \)
```
这里通过否定表达式 (!) 来反转测试结果,从而只选出那些既不是 `.py` 又不是 `.sh` 结尾的常规文件(-type f)[^2]。
#### 对查找到的目标执行额外操作
有时不仅限于简单地列出符合条件的对象列表,还可能需要针对每一个发现的结果采取行动,这时就可以利用 `-exec` 参数附加一条或多条 shell 指令给每个命中项处理。假设现在有一个需求是要删除所有的临时工作文件 (`.tmp`) 同时不触及任何位于 `/var/tmp/` 下的内容:
```bash
find / -path "/var/tmp" -prune -o -name "*.tmp" -exec rm {} +
```
上述命令会在根分区(/)内寻找除了 `/var/tmp` 外的所有 `.tmp` 文件,并安全地移除它们。注意这里的 `{}` 是占位符代表每次迭代中的具体项目,而结尾处的加号(+)表示尽可能多地打包参数传递给单次调用的外部程序以提高效率。
阅读全文