Linux 外挂 SSD 根目录下的 `.Trash-1000` 到底是什么

一次从"这个文件夹谁建的?"到"哦,原来是 FreeDesktop 规范"的排查记录。

概览

某天在自己外挂的 SSD 挂载点 /home/mi/local 根目录下,突然发现一个神秘的隐藏目录:

复制代码
drwx------  5 mi  mi  4.0K  1月 21 22:49 .Trash-1000/

没人主动配置,没装什么奇怪的软件,它就那么出现了。本文记录了它的来龙去脉,回答三个核心问题:

  1. 这是什么?能不能删?
  2. 为什么回收站跑到我的外挂 SSD 上了?
  3. 谁创建的?我有没有配置过?

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.orgTrash 规范 (简称 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 trash CLI 工具
  • 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 基础知识:

  1. FreeDesktop.org 规范体系 ------ 跨桌面环境的互操作标准,trash-spec 只是其中之一,还有 xdg-open.desktop 文件、MIME 类型等
  2. UID 的概念 ------ /etc/passwd 里每个用户对应一个数字 ID,1000 是常规惯例
  3. mv 的跨分区行为 ------ 同分区是 inode 操作,跨分区是数据复制
  4. 挂载点(mountpoint) ------ 外挂 SSD 通过挂载点融入文件系统树,但物理上是独立存储
  5. 隐藏文件约定 ------ 以 . 开头的文件/目录默认不显示,常用于系统/配置/缓存

常用命令速查

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 桌面系统为了**"让你在任何分区里删文件都能快速且可撤销"**而遵守的通用约定。

三句话带走:

  1. 是什么:外挂分区上的本地回收站,符合 FreeDesktop Trash 规范
  2. 为什么 :避免跨分区 mv 退化成昂贵的 cp + rm
  3. 怎么办 :无视 / 定期清 / Shift+Delete 绕开,三选一

参考资料

相关推荐
hhb_6183 小时前
Linux底层运维自动化挂载与磁盘分区实战指南
linux·运维·自动化
cui_ruicheng3 小时前
Linux库制作与使用(二):ELF文件与链接过程
linux·运维·服务器
ReaF_star3 小时前
【环保】CentOS 7 安装 MySQL 8 实战记录:从安装到排障一次讲清
linux·mysql·centos
怀旧,3 小时前
【Linux系统编程】18. Linux进程信号(上)
linux·运维·服务器
minji...4 小时前
Linux 线程同步与互斥(五) 日志,线程池
linux·运维·服务器·开发语言·c++·算法
华清远见IT开放实验室4 小时前
嵌入式系统化课程 学习内容与服务说明
linux·stm32·学习·嵌入式·全栈·虚拟仿真·测评中心
圆山猫4 小时前
[Linux] Ubuntu 26.04 换阿里云镜像源(最新方法)
linux·ubuntu·阿里云
网络小白不怕黑5 小时前
1.2 VMware部署Rocky Linux 9 (MBR分区表,图形化安装)
linux·运维·服务器
贾斯汀玛尔斯5 小时前
每天学一个算法--Aho–Corasick 自动机
java·linux·算法