一次从"这个文件夹谁建的?"到"哦,原来是 FreeDesktop 规范"的排查记录。
概览
某天在自己外挂的 SSD 挂载点 /home/mi/local 根目录下,突然发现一个神秘的隐藏目录:
drwx------ 5 mi mi 4.0K 1月 21 22:49 .Trash-1000/
没人主动配置,没装什么奇怪的软件,它就那么出现了。本文记录了它的来龙去脉,回答三个核心问题:
- 这是什么?能不能删?
- 为什么回收站跑到我的外挂 SSD 上了?
- 谁创建的?我有没有配置过?
Topic 1: .Trash-1000 是什么
背景
在 Linux 系统上,当你用文件管理器(Nautilus / Dolphin / Thunar)删除文件时,这些文件不会立刻消失,而是被挪进"回收站"。大多数人以为回收站只有一个地方:
~/.local/share/Trash/
但如果你有多块硬盘、多个挂载点,就会在那些分区的根目录看到类似 .Trash-<UID>/ 的目录。
目录结构解析
/home/mi/local/.Trash-1000/
├── files/ ← 被删除文件的实体
├── info/ ← .trashinfo 元数据(原路径、删除时间),用于"还原"
└── expunged/ ← GNOME Files 永久删除时的临时暂存区
| 子目录 | 作用 |
|---|---|
files/ |
保存被删除文件本身(改名避免冲突) |
info/ |
每个删除文件对应一个 .trashinfo,记录原始路径和删除时间 |
expunged/ |
GNOME Files 特有,永久删除流程的中转区,删除完成后会被清空 |
数字 1000 的含义
就是你的 UID(User ID) 。Linux 系统为每个用户分配一个唯一的数字 ID,1000 通常是系统安装后创建的第一个常规用户(非 root、非系统账户)。可以验证:
bash
id -u
# 1000
能不能删?
完全可以安全删除。 它的内容等同于回收站里的东西 ------ 清空回收站不会影响任何正在使用的数据。
bash
rm -rf /home/mi/local/.Trash-1000
注意点:
- 删完后,下次再通过文件管理器在
/home/mi/local下删东西,目录会自动重建,这是规范要求的行为。 - 如果平时都用命令行
rm,那这个目录基本不会再长起来。 - 删之前如果里面有重要文件(你曾经误删想还原的),先看一眼
files/里有没有东西。
Topic 2: 为什么回收站会出现在外挂 SSD 上
问题
我没装任何自定义的回收站软件,也没改配置,为什么 .Trash-1000 偏偏出现在 /home/mi/local 根目录?
根本原因:FreeDesktop Trash 规范
这一切来源于 FreeDesktop.org 的 Trash 规范 (简称 trash-spec)。主流桌面环境的文件管理器(Nautilus、Dolphin、Thunar、PCManFM 等)都严格遵守它。
核心规则:回收站必须和被删除文件在同一个分区上。
为什么要这么设计
因为 mv 命令在跨分区时会退化成"复制 + 删除"。举个例子:
bash
# 同分区:瞬间完成(只改 inode 指针)
mv /home/mi/foo.txt /home/mi/.local/share/Trash/files/
# 跨分区:等同于 cp + rm(需要把整个文件重新写一遍)
mv /home/mi/local/huge-10GB.bin /home/mi/.local/share/Trash/files/
如果不管分区,硬把所有删除的文件都扔到 ~/.local/share/Trash/,那在外挂 SSD 上删一个 10GB 文件就会:
- 慢得要死(要复制整整一份)
- 磨损 SSD(写入量翻倍)
- 如果目标盘满了,删除还会失败
规范作者给出的方案:在"该分区的根目录"建一个 .Trash-<UID>/ ,这样删除就永远是同分区 mv,瞬间完成,零复制。
决策流程图
你在文件管理器里按 Delete
│
▼
┌───────────────────────────────────────┐
│ 被删文件所在分区 == $HOME 所在分区? │
└──────────────┬────────────────────────┘
│
┌───────┴───────┐
是 否
│ │
▼ ▼
~/.local/ <挂载点>/.Trash-<UID>/
share/Trash/ 例如 /home/mi/local/.Trash-1000/
验证分区独立性
在本案例中,可以用 df 验证 /home/mi 和 /home/mi/local 是否在不同分区:
bash
df /home/mi /home/mi/local
如果输出的 Filesystem 列显示两个不同的设备,说明它们确实是独立分区,也就解释了为什么会在 /home/mi/local 下单独建回收站。
Topic 3: 谁创建了它?
简短回答
没有人"配置"它,这是桌面系统的自动行为。三个参与方:
| 角色 | 对应实体 |
|---|---|
| 规范 | FreeDesktop.org trash-spec |
| 实现方 | 你当前桌面的文件管理器(大概率是 GNOME Files / Nautilus) |
| 触发时机 | 你第一次 在 /home/mi/local 下用 GUI 删除文件时 |
目录的修改时间 1月 21 22:49 其实就是你第一次在这个盘里通过 GUI 删文件的时刻 ------ 系统悄悄帮你建的。
规范的权威性
这个规范不是某一家厂商的小众约定,而是 Linux 桌面生态的通用标准。遵守它的软件列举:
- GNOME Files (Nautilus) ------ GNOME 桌面默认文件管理器
- KDE Dolphin ------ KDE 桌面默认文件管理器
- XFCE Thunar ------ XFCE 桌面默认
- LXDE PCManFM
gio trashCLI 工具trash-cli命令行工具包
所以无论你用哪个主流桌面,这种行为都是一致的。
实用方案:如何处理它
根据使用习惯,有三种策略:
方案 A:无视它(推荐)
它只在你用 GUI 删文件时才会增长。如果你主要用命令行 rm,它就不会长,占不了多少空间,不用管。
方案 B:定期清理
如果偶尔用 GUI 删东西,可以定期清空:
bash
# 清空所有分区的回收站
gio trash --empty
# 或者手动删
rm -rf /home/mi/local/.Trash-1000
rm -rf ~/.local/share/Trash/*
方案 C:绕过回收站
在文件管理器里用 Shift+Delete 永久删除,跳过回收站。适合确信不会误删的场景。
不推荐:强行禁用
有些教程会教你通过 umount 选项或 polkit 规则禁用回收站。不建议这么做,因为:
- 增加误删风险(删了就真没了)
- 某些软件依赖这个机制
- 带来的好处几乎为零(它本身不占什么资源)
知识点清单
这次排查涉及到的 Linux 基础知识:
- FreeDesktop.org 规范体系 ------ 跨桌面环境的互操作标准,
trash-spec只是其中之一,还有xdg-open、.desktop文件、MIME 类型等 - UID 的概念 ------
/etc/passwd里每个用户对应一个数字 ID,1000是常规惯例 mv的跨分区行为 ------ 同分区是 inode 操作,跨分区是数据复制- 挂载点(mountpoint) ------ 外挂 SSD 通过挂载点融入文件系统树,但物理上是独立存储
- 隐藏文件约定 ------ 以
.开头的文件/目录默认不显示,常用于系统/配置/缓存
常用命令速查
bash
# 查看 UID
id -u
# 查看分区挂载情况
df -h
# 查看两个路径是否同分区
df /path/a /path/b
# 查看外挂盘的回收站占用
du -sh /home/mi/local/.Trash-1000/
# 清空外挂盘回收站
rm -rf /home/mi/local/.Trash-1000
# 清空用户主回收站
rm -rf ~/.local/share/Trash/*
# 跨桌面的回收站清空工具
gio trash --empty
总结
.Trash-1000不是木马、不是流氓软件、也不是你误操作的产物。它只是 Linux 桌面系统为了**"让你在任何分区里删文件都能快速且可撤销"**而遵守的通用约定。
三句话带走:
- 是什么:外挂分区上的本地回收站,符合 FreeDesktop Trash 规范
- 为什么 :避免跨分区
mv退化成昂贵的cp + rm - 怎么办 :无视 / 定期清 /
Shift+Delete绕开,三选一
参考资料
- FreeDesktop Trash Specification ------ 官方规范文档
- GNOME Files (Nautilus) 源码 ------ 规范实现参考
trash-cli项目 ------ 命令行版 trash 工具man mv------ 了解 mv 跨分区行为man df------ 查看文件系统与挂载点