误删文件后应立即停止磁盘写入以提高恢复成功率;可用lsof找回仍被进程占用的已删文件;extundelete仅适用于未启用extents/filetype特性的ext4;photorec按文件头扫描恢复,但无文件名和目录结构;推荐用trash-cli替代rm实现回收站功能。

误删文件后第一件事不是慌,而是立刻停写磁盘
Linux 下删除文件只是解除 inode 链接,数据块本身通常还在,但只要磁盘继续写入(比如日志、缓存、新文件),就可能被覆盖。恢复成功率和「是否立即停止写入」强相关。
-
立刻执行
sudo lsof +L1:如果文件刚被删但进程还在用,lsof会显示deleted状态的条目,此时可直接从/proc/<pid>/fd/<fd_num></fd_num></pid>复制回来 - 不要运行
apt upgrade、journalctl --vacuum、甚至不要开新终端(bash 历史可能写入 ~/.bash_history) - 如果在系统盘操作,优先切到 Live USB 环境再恢复,避免原系统后台服务持续写盘
ext4 文件系统下用 extundelete 恢复已 unlink 的文件
extundelete 是目前对 ext3/ext4 最可靠的老牌工具,但它只支持未启用 extents 或禁用 filetype 特性的旧格式;现代 Ubuntu/Debian 默认开启所有特性,所以它常报 No undeletable inodes in directory。
- 确认文件系统特性:
sudo dumpe2fs -h /dev/sda1 | grep -i "features",若输出含extents或filetype,extundelete很可能失效 - 真正能用的前提是:文件删除前未被
chattr +e(启用 extent 存储),且没开启日志模式(data=journal) - 基本命令:
sudo extundelete /dev/sda1 --restore-file home/user/report.txt,恢复结果默认放在RECOVERED_FILES/目录
通用方案:用 photorec 按文件头恢复,不依赖文件系统结构
photorec 不读取目录或 inode,而是扫描整个块设备,靠识别常见文件魔数(如 PDF 的 %PDF、PNG 的 \x89PNG)重建文件。适合 ext4/xfs/btrfs 甚至损坏分区,但无法恢复原始文件名和目录结构。
- 必须指定原始设备路径,不能挂载后操作:
sudo photorec /dev/sda1,否则会跳过已挂载分区 - 恢复出的文件按类型编号命名(如
f0000001.png),需后续用file或xxd手动筛查 - 速度慢、结果杂,但对大文件(数据库、视频、压缩包)找回率明显高于基于 inode 的工具
- 别指望它恢复小文本文件——
.txt几乎无魔数,容易漏掉或拼错
预防比恢复重要:用 trash-cli 替代 rm
Linux 默认没有回收站机制,rm 是硬删除。装 trash-cli 后,trash 命令把文件移到 ~/.local/share/Trash,保留路径信息和删除时间,还能用 trash-list 查看、trash-restore 交互式还原。
- 安装:
sudo apt install trash-cli(Debian/Ubuntu)或pip install trash-cli - 建议 alias:
alias rm='trash',但注意脚本里慎用——某些自动化流程依赖rm的退出码语义 -
trash不处理 root 权限下的文件,sudo trash /etc/config.bak会失败,得手动 mv 到/root/.local/share/Trash
恢复这事,永远卡在「删完才发现没备份」和「以为能恢复结果只捞出碎片」之间。最常被忽略的是:哪怕用了 photorec,也得先用 dd 对磁盘做镜像再扫,否则边扫边写,越救越少。










