升级macOS Big Sur后Jenkins执行rm -rf删Xcode缓存时报错
问题背景
- 系统升级至macOS Big Sur后,在Jenkins中执行Xcode派生数据目录清理命令:
rm -rf ~/Library/Developer/Xcode/DerivedData/* - 执行过程中触发报错:
rm: /Users//Library/Developer/Xcode/DerivedData/AppDevelopment: Directory not empty - 脚本最终返回退出码1,和“
-f参数可强制删除目标路径下所有内容”的预期不符。
为什么
rm -f没有达到预期效果? -f参数的实际作用是忽略不存在的文件报错、取消删除前的交互确认,它并不具备绕过系统权限、强制删除受保护文件的能力。只要删除流程中遇到无法移除的文件——不管是权限不足、还是被进程占用,哪怕加了-f也会抛出对应报错,最终导致父目录因为存在残留内容,触发“Directory not empty”的提示。
常见触发原因
- 完全磁盘访问权限缺失:Big Sur及后续macOS版本对用户目录下的开发者路径增加了额外的权限校验,Jenkins进程如果没有获得完全磁盘访问权限,就无法删除DerivedData目录下的部分受保护文件,最终造成目录残留。
- 文件被活跃进程占用:执行删除命令时,如果Xcode、xcodebuild等编译进程正持有
AppDevelopment目录下的文件句柄,这些被占用的文件会无法移除,最终导致父目录删不干净。 - 通配符匹配存在遗漏:命令中的通配符
*默认不会匹配以.开头的隐藏文件(如目录锁文件、系统元数据),如果这部分文件因为权限问题没有被删除,就会造成目录非空的报错。 - 环境变量配置异常:从报错中的空用户名路径(
/Users//Library/...)可以判断,执行命令的Jenkins进程没有正确加载$HOME环境变量,导致实际访问的路径和预期存在偏差,出现权限不匹配的问题。
排查与解决方案
- 配置Jenkins的系统权限
打开macOS「系统设置」-「隐私与安全性」-「完全磁盘访问权限」,将Jenkins应用(或运行Jenkins的Java进程)加入允许列表,授权完成后重启Jenkins服务重试。 - 释放占用目录的进程
执行命令定位持有DerivedData目录文件句柄的进程:lsof +D ~/Library/Developer/Xcode/DerivedData/AppDevelopment
正常退出查询到的活跃Xcode、编译类进程后,再重试删除操作。 - 调整删除命令逻辑,规避通配符遗漏问题
不要依赖通配符展开删除目录内容,直接对目标派生数据目录本身执行删除操作:rm -rf ~/Library/Developer/Xcode/DerivedData/AppDevelopment
如果需要清空整个DerivedData目录,可以采用「删除根目录后重建」的方案,避免通配符无法匹配隐藏文件的问题:rm -rf ~/Library/Developer/Xcode/DerivedData && mkdir -p ~/Library/Developer/Xcode/DerivedData - 修正Jenkins的环境变量
在执行删除命令前,强制指定正确的$HOME路径,避免出现空用户名的异常路径:export HOME=/Users/$(whoami)
内容的提问来源于stack exchange,提问作者Ted
相关产品推荐
相关产品推荐

