相信每个玩 Linux 的人都有过一瞬间的窒息:
手快敲成 rm -rf *、脚本写错把日志 / 代码 / 配置全删了、scp 覆盖了重要文件……尤其是做运维、后端、前端部署的同学,误删一次简直想重装系统。
但真相是:Linux 删文件≠真消失,只要没被新数据覆盖,大部分都能救回来。今天这篇就是纯干货、保姆级、一步不乱的 Linux 文件恢复教程,小白也能照抄命令。
全文思维导图

一、先看表格:你属于哪种情况?
表格
| rm 刚删不久 | ext4 | extundelete | ⭐⭐ | 90%+ |
| 删了但程序还在用 | 任意 | lsof | ⭐ | 100% |
| 误删目录 / 批量文件 | ext3/4 | testdisk | ⭐⭐ | 85%+ |
| CentOS 默认 xfs | xfs | xfs_undelete | ⭐⭐⭐ | 70%~85% |
| 分区被格 / 误删分区 | 任意 | testdisk | ⭐⭐⭐ | 60%~80% |
最重要一句话先放这:发现误删后,立刻停止往该分区写任何数据!不要再创建文件、复制文件、日志滚动、下载、部署…… 写入越少,恢复概率越高。
二、最简单急救:文件正在被进程使用(lsof)
适用场景:文件删了,但服务没停(比如 Nginx/MySQL/Node 进程还打开着这个文件)。成功率 100%,白捡一样。
1. 查找被删除但未释放的文件
bash
运行
lsof | grep deleted
你会看到类似:
plaintext
node 1234 user 3r REG 253,1 102400 12345678 /www/server.js (deleted)
2. 直接恢复
把进程对应的 fd 重定向回去即可:
bash
运行
cat /proc/1234/fd/3 > /www/server.js.bak
完事。这是最简单、最稳、零风险的恢复方式。
三、ext4 最强恢复:extundelete(推荐首选)
extundelete 是 ext3/ext4 专用,精准按文件名 / 目录恢复,比 testdisk 好用太多。
1. 安装
Ubuntu/Debian
bash
运行
apt update
apt install -y extundelete
CentOS/RHEL
bash
运行
yum install -y epel-release
yum install -y extundelete
2. 关键:先卸载或只读挂载(非常重要)
假设你的分区是 /dev/sdb1
bash
运行
umount /dev/sdb1
如果提示忙:
bash
运行
mount -o remount,ro /dev/sdb1
3. 恢复指定文件
bash
运行
extundelete /dev/sdb1 –restore-file path/to/your/file
示例:
bash
运行
extundelete /dev/vda1 –restore-file www/index.js
4. 恢复整个目录
bash
运行
extundelete /dev/sdb1 –restore-directory www/
5. 恢复所有被删文件
bash
运行
extundelete /dev/sdb1 –restore-all
恢复后的文件会自动放在当前目录下的 RECOVERED_FILES/ 里。
四、testdisk 万能恢复(支持误删分区)
适合:目录批量删除、分区表损坏、找不到文件、ext/xfs/ntfs 都支持。
安装
bash
运行
# Ubuntu
apt install testdisk
# CentOS
yum install testdisk
使用步骤(保姆级)
bash
运行
testdisk
全程图形化,方向键选择,小白也能看懂。
五、XFS 文件系统恢复(CentOS 常用)
xfs 比较麻烦,没有特别完美的工具,但 xfs_undelete 依然能救。
安装
bash
运行
git clone https://github.com/ianka/xfs_undelete.git
cd xfs_undelete
dnf install gcc make
make
恢复
bash
运行
./xfs_undelete /dev/sda2 -o recovered/
它会批量扫描可恢复文件,按文件名、大小、时间筛选即可。
六、绝对不能做的 5 件事(救命级)
七、从根源避免 rm -rf 悲剧(强烈建议)
1. 给 rm 加 “回收站”
bash
运行
alias rm='trash'
配合 trash-cli,删文件 = 丢回收站,可恢复。
2. 重要数据定时备份
bash
运行
rsync -av /www /backup/
或者用 cron 每日自动备份。
3. 关键目录加权限保护
bash
运行
chattr +i /etc/nginx/nginx.conf
想删都删不掉。
4. 慎用别名
plaintext
alias rm='rm -i'
删前必须确认,能救 90% 的手滑。
结语
Linux 下误删文件真的不是世界末日,只要你不乱写覆盖,ext4 用 extundelete、进程还在就 lsof、分区问题用 testdisk,基本都能救回来。
真正可怕的不是 rm -rf,而是删完还继续往硬盘疯狂写东西。
这篇保姆级教程建议直接收藏,说不定哪天就能救你一晚上甚至一个项目。有用的话欢迎点赞、收藏、转发,让更多玩 Linux 的朋友少走弯路!






