1. 这篇文章真正要解决的问题
如果你在银河麒麟桌面系统上不小心执行了回收站“清空”,或者在文件管理器中按了 Shift + Delete 彻底删除文件,发现回收站瞬间变成空白,第一反应往往是“完了,文件还能找回来吗”。
这个场景并不少见。
日常使用中,用户误清空回收站的情况大致分为三类:
- 在桌面右键点击回收站图标,选择“清空回收站”,没有仔细确认内容。
- 在回收站窗口内按 Ctrl + A 全选,然后直接删除,以为只是临时移除仍然可以在回收站找回。
- 清理磁盘空间时,用系统工具或命令行误删了
~/.local/share/Trash目录。
不管是哪一种,很多人默认以为“回收站清空了就等于文件被彻底销毁了”。这个理解并不完全正确。银河麒麟本质上是一个 Linux 发行版(基于麒麟软件自研的 Kylin Desktop Environment,底层具备完整的 Linux 文件系统机制),它的回收站行为和 Windows 有差异,但文件删除后是否还能恢复,并不取决于回收站里有没有显示,而是取决于文件系统层面是否真的释放了数据块。
所以本文的核心判断是:在银河麒麟中,回收站被清空之后,文件大概率还能恢复,但你必须立刻停止向磁盘写入新数据,并按正确的流程操作。你越晚动手,恢复成功的概率越低。
这篇文章就是给银河麒麟用户、运维人员和刚接触国产 Linux 桌面环境的开发者准备的恢复指南。我会分场景讲清楚两种恢复路径:
- 图形界面优先:适合普通用户,依赖文件管理器自带的“恢复删除文件”功能。
- 命令行拆解:适合误删
Trash目录、无法从回收站界面恢复,或者需要更深层数据恢复的情况。
同时会写清楚那些不该做的操作,以及为什么很多人在这一步会让数据彻底丢失。
2. 银河麒麟回收站的存储机制与删除原理
要理解“清空回收站后怎么恢复”,先得知道银河麒麟把回收站内容放在哪里。
2.1 回收站对应的实际目录
在银河麒麟桌面系统中,回收站对应的是隐藏目录~/.local/share/Trash,注意这个目录默认被隐藏,在文件管理器中按 Ctrl + H 才能看到。
这个目录下有三个子目录:
~/.local/share/Trash/ ├── files/ ├── info/ └── expires/files:存放被删除到回收站的文件本体,属于保留原始数据的区域。info:存放记录文件原始路径和删除日期的元数据,比如home.trashinfo。expires:部分版本中负责过期清理逻辑的目录。
当你把文件从桌面删除到回收站时,系统并没有真的把文件从磁盘上抹掉,只是把文件移动到了Trash/files目录,并在Trash/info目录里写下了一条描述原始位置的信息。
当你清空回收站时,系统才真正执行了unlink操作,释放了文件在文件系统中的目录项。但这里有一个关键点:文件的数据块并不一定立刻被覆盖,在绝大多数情况下,数据块中的原始内容仍然存在于磁盘上,只是系统标记它“可以重新分配”了。
换句话说,清空回收站后数据仍有机会恢复,机会窗口大小取决于你是否在清空之后继续写入了大量数据。
2.2 删除类型对比
很多用户分不清几种删除行为的区别,这里用表格直接对比:
| 删除方式 | 文件是否进入回收站 | 文件数据是否立即覆盖 | 恢复难度 |
|---|---|---|---|
| 右键删除 | 是 | 否 | 简单 |
| 清空回收站 | 否 | 否,仅标记可用 | 中等 |
| Shift + Delete 永久删除 | 否 | 否,仅标记可用 | 中等 |
| 删除 Trash 目录本身 | 否 | 否,仅标记可用 | 中等 |
| 格式化分区后重建文件系统 | 否 | 视格式化强度和后续写入而定 | 较难 |
| 用 dd 覆盖写入新数据 | 否 | 是 | 极难 |
从这个表可以很清楚看到:回收站清空不等于数据立刻被覆盖,这是一个很多人不知道、但对恢复结果影响重大的事实。
2.3 一个容易被忽视的坑
在银河麒麟中,如果你是在文件管理器里对“回收站”执行清空,系统会清空Trash/files下的内容。但如果你是用命令行执行了类似下面的操作:
rm -rf ~/.local/share/Trash/*这时候删除效果和你右键清空回收站基本一样,但有一个差别:rm删除不会保留任何元数据,如果后续要恢复,你不仅需要恢复文件内容,还要自己判断文件原来的路径。这一点会在后面的命令行恢复章节详细说明。
3. 恢复前的最重要准备:停止写入,保护现场
很多用户在发现回收站被清空后,第一动作是打开搜索引擎查“银河麒麟 回收站 清空恢复”,这本身没有问题,但更大问题是他们可能同时还在继续正常使用电脑。
比如:
- 桌面还有自动备份任务向家目录写入数据。
- 文件管理器缩略图正在重新扫描。
- 浏览器下载了新的文件到
~/下载/。 - 系统日志服务持续更新日志。
- 邮件客户端接收了新邮件。
这些操作都会产生磁盘写入。写入过程中,文件系统会优先分配已经标记为“空闲”的数据块,而你清空回收站后,那些数据块恰好就在空闲列表中。一旦新数据覆盖到原来的数据块上,原来文件的一部分就永久无法恢复了。
所以恢复前必须做到以下几点:
- 立即停止所有不必要的磁盘写入操作。
- 如果误删的分区是其他数据盘,可以考虑直接把该分区挂载为只读。
- 如果有条件,优先对原分区做镜像备份,然后基于镜像文件进行恢复。这是最稳妥的方案,也是数据恢复行业的标准操作。
- 绝对不要在误删之后继续用
dpkg安装软件、更新系统、下载大文件到同一磁盘。 - 如果系统盘空间紧张,可以准备一个足够大的优盘或移动硬盘,用于存放恢复工具或镜像文件。
关于“把分区挂载为只读”,不同场景做法不同。
如果误删的位置在系统盘/下(比如家目录中),你不能直接把根分区变成只读,因为这样做会让整个系统无法正常工作。更合理的方式是从 Live USB 启动系统,再把原系统分区挂载为只读,然后再恢复。
如果误删的位置是一个独立数据分区,比如/data分区,则相对简单。你可以用mount的remount选项将分区重新挂载为只读:
# 查看分区挂载信息,确认设备路径 df -h | grep /data # 重新挂载为只读,注意先取消原本的读写挂载 mount -o remount,ro /dev/sdb1 /data这里/dev/sdb1只是示例,实际操作时要以你机器上的设备名为准。
总结一句:恢复成功的关键,不在于你用了多么高级的工具,而在于你有没有在发现丢失的第一时间停止向磁盘写数据。这一点必须在讲任何恢复命令之前强调。
4. 图形界面优先:文件管理器的回收站恢复功能
对于大多数银河麒麟桌面用户来说,先不用进入命令行,很多简单的误删场景可以直接通过文件管理器完成恢复。
4.1 什么时候适合图形界面恢复
- 你只是在文件管理器中删除了文件,还没有执行“清空回收站”。
- 你已经清空回收站,但文件管理器还没有刷新,文件图标可能仍然残留。
- 系统刚完成更新,回收站逻辑被重置。
这些场景下,直接尝试图形界面恢复成本最低,不需要安装任何工具。
4.2 具体操作步骤
在银河麒麟桌面环境下,按以下步骤操作:
- 双击桌面上的“回收站”图标,打开回收站窗口。
- 如果回收站中仍然能看到文件列表,右键点击需要恢复的文件。
- 在右键菜单中选择“还原”,系统会自动把文件恢复到删除时的原始位置。
- 如果原始位置对应的目录已经不存在,系统会提示是否新建目录,或者直接恢复到主目录下,具体以版本行为为准。
- 如果回收站窗口是空白的,先按 F5 刷新一次,再尝试在窗口内搜索缺失文件名。
这里有两个细节值得说明:
第一,银河麒麟的文件管理器(基于 UKUI 的 Peony 文件管理器)还原功能依赖Trash/files和Trash/info两个目录的完整配合。如果两个目录内容不一致,还原可能失败,这时只能走命令行恢复。
第二,如果文件是从优盘、移动硬盘等外部设备删除的,银河麒麟回收站的行为可能会有差异。部分版本对外部设备删除文件时不会进入回收站,而是在设备根目录下创建.Trash-uid目录(其中uid是用户 ID)。这种情况下,你在桌面回收站里永远找不到这些文件。可以在外部设备的隐藏文件中查找。
4.3 图形界面恢复失败后的判断
如果文件管理器中没有出现可还原的文件、刷新后仍然空、回收站目录被整个删除,那就不必再花时间在界面上操作,直接跳到后面的命令行方案。
另外要提醒一件事情:不要反复重启系统来观察回收站是否恢复。每次系统正常启动、用户登录、桌面环境加载,都会产生新的日志和会话文件写入。反复重启对数据恢复没有任何帮助,反而可能增加覆盖风险。
5. 命令行方案一:Trash 目录结构完整时的恢复
这一节处理的情况是:你已经意识到回收站目录被删了,或者回收站内容被清空,但底层的Trash/files和Trash/info目录仍然存在,只是里面还有一部分残留文件。
这种情况在实际工作中并不少见。比如执行了rm -rf ~/.local/share/Trash/*,但某些文件因为被进程占用而没有被删除;或者清空操作因为权限不足而中断,只删掉了部分内容。
5.1 查看回收站目录实际状态
打开终端,执行:
ls -la ~/.local/share/Trash/files/ ls -la ~/.local/share/Trash/info/如果files目录下还有文件,info目录下还有对应的.trashinfo文件,那么你可以手动恢复。
5.2 理解 trashinfo 文件
.trashinfo文件是回收站的元数据文件,记录了文件原始的绝对路径和删除时间。内容类似于:
[Trash Info] Path=/home/user/Documents/report.docx DeletionDate=2024-05-20T15:30:00关键点是Path=这一行,它告诉你文件原本应该在什么位置。恢复时,你需要根据这个路径把文件放回去。
5.3 手动恢复脚本示例
可以写一个简单的 shell 脚本,遍历info目录,读取每个.trashinfo文件,把files中对应的文件或目录移动到原始路径。
#!/bin/bash # 文件路径:restore-trash.sh # 作用:根据 Trash/info 中的元数据,手动恢复 Trash/files 中的残留文件 TRASH_FILES="$HOME/.local/share/Trash/files" TRASH_INFO="$HOME/.local/share/Trash/info" if [ ! -d "$TRASH_FILES" ] || [ ! -d "$TRASH_INFO" ]; then echo "回收站目录不存在或已损坏" exit 1 fi for info_file in "$TRASH_INFO"/*.trashinfo; do [ -f "$info_file" ] || continue # 读取 Path 字段,这是文件删除前的原始绝对路径 original_path=$(grep "^Path=" "$info_file" | cut -d'=' -f2-) # 回收站中保存的文件名就是 trashinfo 文件名去掉后缀 file_name=$(basename "$info_file" .trashinfo) src_path="$TRASH_FILES/$file_name" if [ ! -e "$src_path" ]; then echo "跳过:$file_name 在 files 目录中不存在" continue fi if [ -z "$original_path" ]; then echo "跳过:$file_name 缺少原始路径信息" continue fi original_dir=$(dirname "$original_path") # 如果原始目录不存在则创建 if [ ! -d "$original_dir" ]; then mkdir -p "$original_dir" echo "已创建原始目录:$original_dir" fi # 如果原始路径已存在文件,则不覆盖,避免数据覆盖造成二次损失 if [ -e "$original_path" ]; then echo "警告:$original_path 已存在,跳过覆盖" continue fi mv "$src_path" "$original_path" echo "已恢复:$original_path" done echo "恢复脚本执行完成"此脚本的核心逻辑很简单:借助.trashinfo文件中的原始路径,把残留文件移动回去。脚本本身不执行任何覆盖操作,如果一个目标路径已经有文件,宁可跳过,也不要做危险的覆盖。
运行方式:
chmod +x restore-trash.sh bash restore-trash.sh5.4 这个方案的限制
这个方案只能恢复那些仍残留在Trash/files中的文件。如果回收站清空操作已经把文件名字从目录中抹掉了,那么这些残留文件本身并不存在,这个脚本也救不了。真正需要更进一步解决的是第 6 节要讲的磁盘级恢复。
6. 命令行方案二:用 extundelete 恢复 ext4 分区已删除文件
银河麒麟默认文件系统通常是 ext4。如果你清空回收站后没有继续大量写入,那么使用 extundelete 是成功率较高的选择。
extundelete 是一个开源工具,专门用于从 ext3/ext4 文件系统中恢复已删除的文件和目录,能够通过分析文件系统日志和未使用的数据块,找出被删除的文件数据。
6.1 安装 extundelete
在银河麒麟系统中,可以尝试以下命令安装:
sudo apt update sudo apt install extundelete如果软件源里没有,可以先尝试:
sudo apt-get install -y extundelete如果默认源不包含该软件包、网络源受限,或者由于内网环境导致无法在线安装,也可以下载源码编译。源码编译基本依赖是e2fslibs-dev或libext2fs-dev:
sudo apt install -y build-essential e2fslibs-dev libext2fs-dev autoconf编译安装步骤:
wget https://sourceforge.net/projects/extundelete/files/extundelete/0.2.4/extundelete-0.2.4.tar.bz2 tar -xjf extundelete-0.2.4.tar.bz2 cd extundelete-0.2.4 ./configure make sudo make install这里需要说明:下载源码时要注意实际网络环境和工具版本,如果无法访问外网,那么你应该优先考虑系统软件源中可用的工具。
6.2 确认设备路径和文件系统类型
在开始恢复前,先确认要恢复的分区是哪个设备。
df -hT lsblk -f假设你误删的数据原本在/home分区,而显示结果中对应设备为/dev/sda3,文件系统类型为ext4,后面就以这个作为示例。
6.3 恢复单个已删除目录的基本命令
# 进入一个独立的恢复目录,建议放在另外一块磁盘上 mkdir /home/user/restore_out cd /home/user/restore_out # 以只读方式恢复 /dev/sda3 中被删除的 Documents 目录 sudo extundelete /dev/sda3 --restore-directory /home/user/Documents执行成功后,可以在当前目录下看到RECOVERED_FILES目录,恢复出来的文件就在其中。
6.4 恢复全部已删除文件
如果不确定文件原路径,可以先把分区上所有被删除文件都恢复出来,不过这样做会产生大量文件名无法完整还原的情况。
sudo extundelete /dev/sda3 --restore-all运行结果会输出类似:
Loading filesystem metadata ... 400 groups loaded. Searching for recoverable files in directory / ... ... 11 recoverable inodes found. Restoring files using inode 130533 ...出现Restoring files using inode ...的日志说明恢复过程确实找到了被删除的文件数据。
6.5 相关命令行参数建议
--restore-file path:恢复指定单文件。--restore-directory path:恢复指定目录。--restore-inode inode编号:通过 inode 编号恢复。--restore-all:全量恢复。--after date:只恢复指定时间之后被删除的文件。-o 输出目录:指定恢复文件输出位置,比较推荐加上这个参数。
sudo extundelete /dev/sda3 --restore-all --after $(date -d "2024-05-20 12:00:00" +%s) -o /home/user/restore_out使用--after可以过滤出更早时间段内删除的文件,避免大量无用结果干扰判断。
6.6 注意事项
extundelete恢复结果不是百分百可靠。恢复出来的文件可能损坏、文件名丢失、目录结构错乱,但数据部分仍然有价值。对于那些被覆盖的数据块,工具无法恢复出原来的内容,这也是为什么我一直强调“停止写入”的原因所在。
7. 更底层的方案:PhotoRec 深度扫描恢复
如果系统更新过软件包、下载过大文件,或者误删发生在几天前才想起来,那么 extundelete 可能已经找不到完整文件了。这个时候可以考虑 PhotoRec。
PhotoRec 是 TestDisk 工具套件中专门用于文件载数据恢复的工具。它的工作方式不是依赖文件系统日志或目录项,而是直接扫描整个分区,通过文件头特征识别已知格式的文件。这意味着即使文件系统的目录项已经没了,只要数据块中的内容还在,PhotoRec 就有机会找到并恢复出来。
乍看之下可能以为这只是恢复照片的软件,其实它支持的格式非常广,包括文档、PDF、压缩包、视频、Office 文件等数百种常见文件格式。
7.1 安装 TestDisk / PhotoRec
sudo apt install testdisk安装后可以使用photorec命令。
7.2 PhotoRec 交互式恢复过程
PhotoRec 是交互式命令行工具。执行:
sudo photorec操作流程大致如下:
- 选择要扫描的磁盘设备,用上下键移动高亮,按回车确认。
- 选择分区类型表。默认
Intel适用于大多数 PC 场景,银河麒麟也是标准 PC 分区表,按默认选即可。 - 选择目标分区。这里注意选择误删文件所在的分区,不要选到其他分区。
- 选择文件系统类型。ext4 分区选择
ext2/ext3选项,这个选项覆盖 ext4。 - 询问是否只对未分配空间进行搜索(Free),还是对整个分区搜索(Whole)。如果误删文件且后续没有大量写入,选择
Free可以显著加快扫描速度。如果文件已经删除很久且不确定数据块是否仍属于该文件,选Whole更稳妥。 - 选择恢复文件存放目录。务必选择与源分区不同的磁盘,避免写入覆盖。
- 开始扫描后,会显示实时进度:
Pass 0到Pass 5是扫描阶段。Recovered计数不断增加,表示找到并恢复的文件数量。
恢复完成后,目标目录下会出现许多recup_dir.1、recup_dir.2等文件夹,里面是按文件类型整理的恢复结果。
7.3 PhotoRec 的适用评估
PhotoRec 适用于:
- 文件系统元数据已经损坏或丢失。
- 误删后磁盘小块区域被写入,但整体数据结构还完整。
- 其他恢复工具找不到任何东西时作为兜底方案。
PhotoRec 的缺点也要写清楚:
- 恢复出的文件名大部分会变成编号,比如
f123456.pdf,需要人工打开和整理。 - 对大分区扫描耗时极长。
- 对数据库文件、Word 文档等复合文件,有时恢复出的文件内容不完整。
因此,PhotoRec 更适合作为一种最后补救手段,不适合作为日常首选。
8. 使用磁盘镜像备份来降低恢复风险
在真正执行深度恢复之前,强烈建议先对原分区做一个镜像。这样做的好处是,即使后续恢复工具操作破坏了原数据,也可以随时从镜像重新开始。
ddrescue是一个流行的磁盘恢复镜像工具,在处理有坏道或读取不稳定的磁盘时表现比dd更稳定。
安装方式:
sudo apt install gddrescue镜像命令示例:
# 将 /dev/sda3 分区镜像到 /mnt/backup/sda3.img sudo ddrescue -d -r3 /dev/sda3 /mnt/backup/sda3.img /mnt/backup/sda3.logfile参数说明:
-d:直接访问磁盘设备,绕过系统缓存。-r3:对于读取失败的数据块重试 3 次。/mnt/backup/sda3.img:镜像文件,需要确保目标磁盘剩余空间足够,通常至少要和源分区大小一致。/mnt/backup/sda3.logfile:日志文件,记录复制进度,中断后可以从断点继续。
镜像完成后,后续所有恢复操作都可以改用:
sudo extundelete /mnt/backup/sda3.img --restore-all或者:
sudo photorec /mnt/backup/sda3.img部分工具对镜像文件的支持方式可能略有不同,需要根据实际命令帮助确认。
对于普通用户而言,如果磁盘没有明显硬件故障,可以使用更简单的dd命令:
sudo dd if=/dev/sda3 of=/mnt/backup/sda3.img bs=64K conv=noerror,sync status=progresssandbox中conv=noerror,sync的作用是读取错误时继续,不会因为一个坏块就中止镜像过程。
9. 常见问题与排查思路
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 回收站窗口显示空白,但桌面文件还在 | 回收站目录被清空,或者文件被 Shift+Delete 永久删除 | 检查~/.local/share/Trash/files是否为空 | 使用 extundelete 或 PhotoRec 恢复 |
| 回收站中有文件,但右键没有“还原”选项 | 文件管理器异常或者进入了某些特殊视图 | 切换到完整文件夹视图并重新启动文件管理器 | 用命令行mv手动把文件移动到原始位置 |
| 还原时提示“原始文件夹不存在” | 原目录被删除或改名 | 阅读.trashinfo中记录的Path | 手动创建目录后再还原 |
| extundelete 执行后没有找到文件 | 删除时间过长,数据块被新文件覆盖 | 使用 PhotoRec 扫描整个分区 | 改用 PhotoRec 或接受部分恢复结果 |
| PhotoRec 恢复出的文件打不开 | 文件被部分覆盖,或识别出的类型不对 | 检查文件大小和文件头 | 尝试其他恢复工具,或从镜像恢复后再次扫描 |
| 恢复出的文件名全部是编号 | PhotoRec 不保留原始文件名 | 查看文件内容和修改时间 | 根据内容手工重命名 |
| 优盘上的文件删除了但回收站里找不到 | 外部设备删除可能不进入回收站 | 在优盘根目录中查找.Trash-uid隐藏目录 | 手动恢复.Trash-uid中的文件 |
10. 最佳实践与工程建议
恢复永远是被动方案,预防才是高效路径。在银河麒麟环境下,有几个工程上值得落实的建议。
10.1 定期备份家目录和关键数据
银河麒麟很多用户的家目录包含了大量工作文档、代码和数据库文件。推荐使用rsync做增量备份,备份到外部磁盘或局域网服务器。
# 同步家目录到备份盘,排除缓存目录 rsync -av --delete --exclude '.cache' --exclude '.local/share/Trash' \ /home/user/ /mnt/backup/home_user/--delete参数表示本地删除文件后,备份端也同步删除,这样可以保持备份与源目录一致。备份完成后建议单独验证几个重要文件能否正常打开。
10.2 重要文件采用版本管理
代码和文档建议纳入 Git 或 SVN 版本管理。即使文件被删除,Git 历史记录中仍然保留着所有已提交版本,这不依赖文件系统是否覆盖。使用远程仓库(如 GitLab、Gitea)之后,你还多了一重异地容灾能力。
10.3 安装恢复工具应提前完成
不要等到文件丢失之后再安装 extundelete 或 testdisk。因为安装包本身会写入系统盘,尤其是在系统盘空间较小的情况下,一个几十兆字节的软件包就有可能覆盖掉你需要恢复的某个数据块。建议在系统正常运行期间提前安装好这些工具,作为日常应急储备。
10.4 高价值数据场景采用快照策略
如果银河麒麟部署在服务器或虚拟化环境中,可以启用 LVM 快照或使用虚拟化平台自带的快照功能。快照可以追溯到误删除前的任意时间点,恢复成本远低于文件级恢复。
10.5 对生产环境的严格约束
如果银河麒麟用于生产环境,应避免使用root执行rm -rf这类高风险命令。可以利用权限分离,让日常操作使用普通用户,只有明确必要时才切换 root。同时可以启用安全审计日志,记录关键目录的删除行为,方便快速定位误删操作。
10.6 不要随意清空回收站
操作系统层面的回收站本质是一种误操作缓冲区。在不确定内容之前,不要频繁执行“清空回收站”。很多 Linux 管理员习惯用rm -rf,但在桌面 Linux 场景下,建议尽量使用文件管理器中的普通删除,给恢复留下余地。
11. 总结与后续学习方向
银河麒麟误清回收站的恢复,核心思路并不复杂:
- 发现误删后立即停止磁盘写入。
- 优先检查回收站目录
~/.local/share/Trash是否还有残留内容。 - 根据文件系统类型选择恢复工具,ext4 分区使用 extundelete,复杂场景使用 PhotoRec。
- 有条件时先做分区镜像,再基于镜像恢复。
- 日常配置好备份和快照,降低对恢复工具的依赖。
值得继续深入的方向有两个:
一是文件系统底层知识。理解 ext4 的 inode、块分配、日志机制,会直接影响你对恢复工具输出结果的理解,也能帮助你判断“什么时候该放弃恢复”。推荐学习 ext4 文档和debugfs的使用。
二是数据恢复工具的原理。PhotoRec 的文件签名扫描思路,learn 如何在未知分区中找文件;extundelete 的日志回放思路,learn 如何利用文件系统自身的冗余信息重建目录结构。掌握这些之后,遇到任何 Linux 发行版的数据丢失问题,你都能快速形成排查路径。
建议收藏本文备用,并提前在你的麒麟机器上安装好恢复工具。最好亲自在测试环境里执行一遍完整的删除和恢复流程,确认工具在本机上能正常运行,避免真正遇到问题时才发现某个依赖没有装好。