永久删除文件或目录,不进入废纸篓,误删后通常无法恢复。
macOS 的 rm 来自 BSD,删除是直接解除目录项,不经过 Finder 的废纸篓,也没有系统级回收站。-r/-R 递归删除目录,-i 逐个确认,-I 在参数超过三个时只确认一次,-d 可删除空目录,-v 显示删除过程,-x 不跨挂载点。
与 GNU 的差异:macOS 的 rm -P 只是为兼容保留,手册明确说明它没有效果,不要把它当安全擦除;GNU 的 --preserve-root、--one-file-system 长选项在 macOS 上不存在,对应短选项是 -x。macOS 的 -W 只用于处理 unionfs 的 whiteout,对普通文件没有“反删除”作用。
影响范围:
rm删除的是当前用户有权限写入的目录项,sudo rm可扩大到系统范围;删除后空间可能仍被打开该文件的进程占用,但文件名已不可见。 先备份:重要目录先确认 Time Machine 有最近备份,或先cp -a到另一块盘;不确定时把rm换成mv移到临时目录。 如何回滚:没有内置撤销。Time Machine 开启时可用本地快照或备份恢复;没有备份只能停止写入并尝试数据恢复,成功率不保证。
# 先确认位置和内容,再删除单个文件
% pwd && ls -l notes.txt && rm -i notes.txt
# 多个文件只确认一次,避免交互式脚本卡住
% rm -I ~/Downloads/*.dmg
# 删除构建目录;路径写死或先用变量校验,不要直接拼空变量
% rm -rf ~/Projects/app/build
# 先预览再删除,find 的 -delete 不会进废纸篓
% find ~/Downloads -name '.DS_Store' -print
% find ~/Downloads -name '.DS_Store' -delete
# 变量为空时立即退出,避免 rm -rf 作用到根目录
% rm -rf "${BUILD_DIR:?BUILD_DIR 未设置}/"
# 删除前确认文件是否仍被进程占用,空间要等进程退出才释放
% lsof +L1 | head
# Time Machine 开启时查看本地快照,作为误删后的恢复线索
% tmutil listlocalsnapshots /
rm -rf $DIR/* 在 DIR 为空时会展开成 /*,这是最典型的灾难写法。脚本必须用 set -u、"${DIR:?}",并在执行前 printf '%s\n' "$DIR" 核对;路径以 - 开头时用 rm -- -文件名。rm -rf 不询问、不校验目标是否是挂载点。删除前用 df 路径、mount 确认没有误删外接盘或网络卷内容。df 没变小,通常是进程仍打开已删除文件。用 lsof +L1 或 lsof | grep deleted 找到进程,重启或让它关闭文件描述符。rm -P 在 macOS 上无效,SSD 和 APFS 的写时复制、磨损均衡也让“覆写擦除”不可靠。敏感数据依赖 FileVault 全盘加密,而不是 rm -P。Operation not permitted,sudo 也不能绕过;需要给终端授予完全磁盘访问权限。sudo rm /System/... 会失败。不要为删除系统文件去关闭 SIP。mv — 不确定时先把文件移到待删目录。find — 按条件筛选后再删除,先 -print 预览。df — 确认删除后文件系统空间是否真正释放。rm — GNU 版对照,注意 --preserve-root。del — Windows CMD 的文件删除。rd — Windows CMD 的目录删除。合上页面,先回答,再展开对照。
rm 会把文件放进废纸篓吗?rm -P 能安全擦除数据吗?rm -rf $DIR/* 在变量为空时极其危险?给出一种安全写法。df 没有释放空间,应该检查什么?-P 在 macOS 上无效果,不能作为安全擦除手段。/*;应写 rm -rf "${DIR:?}/" 并先校验变量。lsof +L1 定位。
小程序版
微信扫码,随时查命令