You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的脚本删除了Documents和Downloads目录?(macOS 10.13.3)

为什么你的macOS清理脚本意外删除了Documents和Downloads目录?

哎呀,这绝对是每个脚本新手都可能踩的大坑!我来帮你拆解问题根源,以及怎么彻底避免再遇到这种糟心的事。

问题核心:cd失败后,rm在错误的目录执行了

你的脚本最大的问题在于没有验证目录切换(cd)是否成功,也没有设置脚本在命令出错时停止运行。举个最可能发生的场景:

  1. 你在用户主目录~/下启动了脚本。
  2. 脚本尝试切换到/System/Library/Caches——虽然这个目录存在,但macOS的系统完整性保护(SIP)会阻止普通用户删除这里的内容,所以后续的rm -rf ./*会报错,但因为脚本没有设置错误终止,它会直接忽略这个错误继续往下跑。
  3. 接下来切换到~/Library/Caches是成功的,这一步的清理也没问题。
  4. 然后脚本尝试切换到~/.cache——划重点:在macOS High Sierra中,这个目录默认是不存在的(只有安装部分Linux兼容工具时才会被创建),所以cd命令直接失败了。
  5. 但脚本依然执行了rm -rf ./*,而此时当前工作目录还是你最初运行脚本的地方——也就是~/!这就直接把主目录下所有可见的文件和文件夹(包括Documents、Downloads)都删掉了。

哪怕是其他cd步骤失败(比如路径打错、权限不足),只要脚本没停止,rm就会在当前目录执行,风险极高。

怎么修复这个脚本?

我给你改写了一个安全版的清理脚本,同时附上关键改进点:

#! /bin/bash
# 开启严格模式:命令失败立即终止,捕获未定义变量,捕获管道错误
set -euo pipefail

# 统一彩色输出函数,让日志更清晰
print_info() {
    echo -e "\x1B[35m $1 \x1B[0m"
}

print_info "Clearing user library cache..."
# 直接用绝对路径,不需要cd,避免切换目录失败的风险
rm -rf ~/Library/Caches/*

# 先检查目录是否存在,再清理
if [ -d ~/.cache ]; then
    print_info "Clearing user cache..."
    rm -rf ~/.cache/*
fi

print_info "Removing outdated Homebrew packages..."
brew cleanup

print_info "Clearing Homebrew cache..."
# 使用brew自带的缓存路径查询,避免硬编码出错
rm -rf "$(brew --cache)"

关键改进说明:

  1. set -euo pipefail:这行是脚本安全的基础,任何命令出错都会让脚本立刻停止,不会继续执行后续的危险操作。
  2. 直接用绝对路径执行rm:彻底抛弃cd后再删的方式,从根源上避免目录切换失败带来的风险。
  3. 检查目录是否存在:对~/.cache这种非默认存在的目录,先判断再清理,避免无意义的错误。
  4. 跳过系统级缓存清理:/System/Library/Caches受SIP保护,普通用户无法安全清理,而且系统会自动管理这些缓存,手动清理反而可能导致系统不稳定。

最后给你几个重要提醒:

  • 运行任何清理脚本前,一定要先备份重要数据!哪怕是你认为绝对安全的脚本。
  • 不要随便用sudo运行清理脚本——root权限下的rm会让破坏范围指数级扩大。
  • macOS的缓存大部分是系统自动管理的,除非你确实遇到了缓存导致的问题,否则没必要手动清理。

内容的提问来源于stack exchange,提问作者SilecchiaJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:24:03