Watch at Ease看见世界,读懂生活。

科技 · 实用指南

rm -rf 仍报“Directory not empty”?先证明哪个目录项在返回

不要重复破坏性命令,先确认仍是同一目录、哪个条目残留或重建,以及所有者是进程、挂载、NFS 服务器还是 FUSE 驱动。

确认目录身份、条目和所有者的示意图
原创插画:证明哪个条目残留或返回。 Watch at Ease

不要重复破坏性命令,先确认仍是同一目录、哪个条目残留或重建,以及所有者是进程、挂载、NFS 服务器还是 FUSE 驱动。

ENOTEMPTY 表示删除时仍有条目,但不标识所有者。 默认列表看似为空可能漏掉 dotfile,也不能证明远端或并发状态。

1. 冻结目标身份

保存准确命令、stderr、退出状态、绝对路径、父路径、设备、inode、文件系统类型和挂载源。以非破坏方式解析符号链接,确认失败名称仍指向同一对象。

不要从看似空的 ls 推断安全。命令可能位于不同容器或挂载命名空间,bind mount 可能遮住另一棵树,名称也可能在两次尝试间被替换。

2. 两次捕获全部目录项

列出 dot 条目和异常字节名称,但不要把列表输出直接传给 rm。制作两份带时间戳的名称、元数据和设备/inode 快照,以区分稳定子项和删除后被重建的名称。

ENOTEMPTY 只表示删除时仍有条目,不说明原因。再次操作前保存准确子项名以及 .nfs 或 .fuse_hidden 模式。

3. 分类返回条目的所有者

普通本地条目要找出创建它的应用或任务;.nfs 或 .fuse_hidden 占位项要找出仍打开底层文件的进程;NFS 则与存储负责人对比客户端和服务器视图。

不要杀无关进程,也不要假定 sudo 能改变文件系统状态。创建者会立即重新填充,远端服务器或用户态文件系统也可能保留客户端列表未显示的名称。

4. 实施最小修复

停止或暂停已证明的写者,关闭已证明的句柄,或由存储负责人修复远端/FUSE 状态。然后只删除已核实的子项和目录,不扩宽路径、不跨文件系统,也不盲目重建受管挂载点。

批准替换目录时,先记录所有者、模式、ACL、标签、挂载角色和服务所有权。只重建路径名并不等于保留这些契约。

5. 验证未再出现并保留证据

删除后再次采集原始名称和身份快照,等待已知写者或缓存周期,并从同一命名空间和权威存储视图确认路径持续不存在。

记录原始 errno、责任进程或存储层、动作以及相关哈希/元数据和回滚。重复的 NFS/FUSE 分歧或 I/O 错误应升级处理,不要塞进重试循环。

本地、活动和远端目录项决策图
原创插画:分类后选择最小修复。 Watch at Ease