前几天朋友老张急匆匆找我,说他在服务器上解压一个大文件时,不小心把正在用的临时文件给删了,结果解压直接卡住,程序报错,网站后台也打不开了。他第一反应是完了,数据没了。其实这种情况并不少见,特别是在操作服务器或本地大文件解压时,一不小心就手滑删掉带“.tmp”后缀的文件。
临时文件到底是干嘛的?
很多人看到“temp”或者“tmp”就觉得是垃圾文件,顺手清掉。但其实在解压过程中,压缩软件会先创建临时文件来存放部分解压数据。比如你用 WinRAR、7-Zip 或者 Linux 下的 tar、unzip 命令,都会在目标路径生成临时文件。这些文件没到解压完成那一刻,都不能动。
举个例子:你想把一个 5GB 的网站备份包 backup.zip 解压到网站根目录,系统会先生成 backup.tmp 或类似名称的临时文件。这时候你要是执行了 rm *.tmp 清理命令,刚好命中这个文件,那解压就断了,可能连原始压缩包都损坏。
误删之后还能恢复吗?
如果是 Linux 服务器,文件刚删还有救。ext4 文件系统虽然删了 inode,但数据块还没被覆盖前,可以用工具尝试找回。比如用 debugfs 或者 extundelete:
extundelete /dev/sda1 --restore-file /path/to/your/tempfile.tmp
但前提是这个分区没有大量写入操作。如果已经继续运行了一段时间,恢复概率就低了。Windows 上可以试试 Recuva 或 Disk Drill 这类工具扫描回收站之外的残留数据。
怎么避免再踩坑?
最简单的办法是:别随便清理你不熟悉的临时目录。尤其是 /tmp、/var/tmp 或用户家目录下的隐藏临时文件夹。如果你非要定期清理,可以加个过滤规则:
find /tmp -name "*.tmp" -mmin +60 -delete
意思是只删掉 60 分钟前创建的 tmp 文件,给正在运行的任务留出时间窗口。另外,解压大文件前最好新建个专用目录,解压完再移动,减少误伤。
还有一个实用技巧:解压时用 -d 指定输出路径,别图省事直接在当前目录敲命令。比如:
unzip backup.zip -d ./restore_temp/
这样所有中间文件都在可控范围内,就算出问题也不影响其他服务。
老张后来用了 extundelete 恢复了部分数据,重新跑了解压。从那以后,他再也不敢在服务器上乱删 tmp 文件了。记住一句话:看着像垃圾的文件,未必真能扔。