能恢复,关键取决于文件系统类型、是否及时停写及是否被新数据覆盖:ext3/ext4可用extundelete高概率恢复;XFS/Btrfs需依赖快照或photorec扫描,无法保留原名与结构。

误删目录后能否恢复,主要看三点:文件系统类型、是否及时停写、有没有被新数据覆盖。ext4/ext3 有较高成功率;XFS、Btrfs 基本无法原样恢复,得靠备份或块级扫描。
第一步:立刻冻结磁盘写入
这是成败关键,越快越好:
- 查目录所在分区:df -T /path/to/deleted/dir,记下设备名(如 /dev/sdb1)和 Type(如 ext4)
- 若能卸载,立即执行:sudo umount /dev/sdb1
- 若提示 busy,先查占用进程:sudo lsof +D /path/to/deleted/dir,再用 sudo fuser -k -m /mount/point 终止
- 无法卸载时(如根分区),强制只读:sudo mount -o remount,ro /dev/sdb1
- 避免任何可能触发写入的操作:不要运行 apt/yum、不要 ls -R、不要 touch、不要重启服务
第二步:按文件系统选工具
ext3/ext4 分区(最常见)→ 用 extundelete
- 安装(Ubuntu/Debian):sudo apt install extundelete;CentOS 需先启用 EPEL 再 yum install extundelete
- 恢复指定目录:sudo extundelete /dev/sdb1 --restore-directory "data/myapp"(路径是相对于分区根目录,不带挂载点前缀)
- 不确定路径时,先查可恢复项:sudo extundelete /dev/sdb1 --inode 2,再逐层用 inode 查找目标目录
- 恢复结果默认存进当前目录的 RECOVERED_FILES/ 子目录中
XFS 分区 → 几乎无法直接恢复,必须依赖备份
- 日常需用 xfs_dump 定期备份:xfs_dump -f /backup/data.dump /dev/sdb1
- 恢复时需先卸载、格式化(谨慎!)、挂载,再执行:xfs_restore -f /backup/data.dump /mount/point
- 没有备份就只能用 photorec 扫描,但会丢失所有文件名和目录结构
Btrfs 分区 → 优先查快照
- 列出快照:sudo btrfs subvolume list /mount/point
- 用 btrfs restore 恢复指定子卷:sudo btrfs restore /dev/sdb1 /recover -t <subvolid>
- 无快照则同样依赖 photorec
第三步:photorec 扫描(兜底方案)
适用于所有文件系统,尤其当 extundelete 失效、分区已被重新挂载、或文件系统是 XFS/Btrfs 时:
- 安装:sudo apt install testdisk(photorec 是其组件)
- 运行:sudo photorec /dev/sdb1
- 交互菜单中选分区 → 选 “Other” 文件系统类型 → 选存储位置(务必选另一块盘,不能写回原盘)
- 它按文件头尾特征识别数据,恢复出的文件无原名、无目录结构,需手动筛选
最后提醒几个易错点
- 根分区(/)误删,别在原系统操作,必须用 Live USB 启动后再挂载为只读处理
- 不要在原分区上安装恢复工具,避免写入覆盖
- extundelete 对已覆盖或日志清空的分区会报 No journal found,此时只能换 photorec
- 恢复后务必验证内容:file 看类型、ls -lh 看大小、打开关键文件确认可读


















