文件被 rm 之后还能救回来吗?一文掌握 trash-cli 命令行回收站的完整用法
文件被 rm 之后还能救回来吗?一文掌握 trash-cli 命令行回收站的完整用法
【免费下载链接】trash-cliCommand line interface to the freedesktop.org trashcan.项目地址: https://gitcode.com/gh_mirrors/tr/trash-cli
如果你在服务器上做过运维,多半经历过这样的时刻:一条rm -rf敲下去,回车之后才猛然想起目录里还有一份没备份的配置;又或者在某次"清理磁盘"时,把同事刚生成的报表一起删了。rm的好处是干脆利落,代价是没有任何后悔药。这时候你会意识到:删除操作真正缺的不是"更快的删除",而是一条安全的退路。trash-cli 正是为这个缺口设计的——它是 freedesktop.org 回收站标准的命令行实现,让你在终端里也能像桌面环境那样"先删进回收站、随时可恢复",而且和你 GNOME、KDE 图形界面里的回收站是同一个。
先想清楚一个问题:为什么rm不适合当日常删除工具
很多人第一次接触 trash-cli 时会问:我用了十几年rm,也没出过大事。这个判断基本靠运气。rm的设计目标是"立即释放空间",它既不询问、也不留痕,更没有"后悔"这个功能。下面这张表能直观看出它和回收站式删除的本质差异:
| 维度 | rm直接删除 | trash-cli 回收站删除 |
|---|---|---|
| 删除后是否可恢复 | 不可,除非提前备份 | 可以,随时用 restore 找回 |
| 是否记录原路径 | 不记录 | 每个文件都记录原始位置 |
| 是否记录删除时间 | 不记录 | 写入 DeletionDate 字段 |
| 是否跨分区安全 | 与回收站无关 | 遵循"同卷优先"规则 |
| 是否适合放进脚本 | 危险,误操作代价高 | 安全,可配合 cron 自动清理 |
rm不是不能用,而是应该留给"确认不要了"的场景。日常的、试探性的、可能还要反悔的删除,都应该走回收站。trash-cli 的价值就是把这个习惯变成一条命令的事。
三分钟跑通第一个最小示例
安装方式按自己的环境选一种即可。最通用的是 pip,想隔离环境就用 pipx,Debian/Ubuntu 用户也可以直接用系统包管理器:
pip install trash-cli # 或者 pipx install trash-cli装好之后,验证一下三个命令是否就位:
trash-put --version现在做一个完整的"删除 → 查看 → 恢复"闭环。先造一个测试文件:
mkdir -p ~/tmp/trash-demo echo "这是一份重要的草稿" > ~/tmp/trash-demo/meeting-notes.txt把它送进回收站:
trash-put ~/tmp/trash-demo/meeting-notes.txt确认原文件已经不在原位,然后列出回收站内容:
trash-list输出会类似这样,每一行左侧是删除时间,右侧是文件被删除前的完整路径:
2026-08-14 18:20:11 /home/you/tmp/trash-demo/meeting-notes.txt最后把它恢复回来:
trash-restore 0 2026-08-14 18:20:11 /home/you/tmp/trash-demo/meeting-notes.txt What file to restore [0..0]: 0输入序号0回车,文件就回到了原位,内容分毫不差。到这里,你已经掌握了 trash-cli 最核心的三个动作:trash-put送进回收站、trash-list查看清单、trash-restore按序号恢复。
回收站里到底存了什么:一份.trashinfo的前世今生
用过图形界面回收站的人可能会好奇:trash-cli 怎么保证和桌面环境"同一个回收站"?答案藏在目录结构和元数据文件里。
主分区(通常是家目录所在卷)的回收站位于:
~/.local/share/Trash/ ├── files/ # 被删除文件的真实存放处 └── info/ # 与文件一一对应的元数据你删掉的meeting-notes.txt会变成files/meeting-notes.txt,同时在info/下生成一个meeting-notes.txt.trashinfo。这个元数据文件是纯文本,格式遵循 freedesktop.org 的 Trash 规范,核心内容就两行:
[Trash Info] Path=/home/you/tmp/trash-demo/meeting-notes.txt DeletionDate=2026-08-14T18:20:11Path记录原始位置(带 URL 编码),DeletionDate记录精确到秒的删除时间。trash-list读的就是这两个字段,trash-restore靠Path决定把文件放回哪里。想深入看解析逻辑,可以读trashcli/parse_trashinfo/目录下的实现。
跨分区的情况会稍微复杂:如果被删文件不在主分区上,trash-cli 会优先在该分区的挂载点创建.Trash/<uid>目录,规则细节写在docs/trash-directories.txt里。日常使用你基本感知不到这个过程,只要知道"每个分区的文件都会就近进回收站"就够了。
高频场景:批量恢复、按时间清理、按模式定点删除
上面是最小闭环,实际使用中还有三个高频操作值得单独拎出来。
批量恢复,一次选多个。trash-restore的输入框支持逗号分隔和区间写法。比如回收站里有 5 个文件,你想恢复第 1、2、4、5 个:
What file to restore [0..4]: 0-1,3-4它会依次把选中的文件全部放回原位。注意恢复时如果原位置已经有同名文件,默认会拒绝覆盖并给出提示,确认想覆盖的话可以用--overwrite参数。
按时间清理,给回收站设保质期。回收站最大的隐患是"只进不出",磁盘迟早被占满。trash-empty支持天数参数,只删除超过指定天数的文件:
# 清空 30 天前的所有回收站文件 trash-empty 30不带参数就是全部清空,请谨慎使用。这个"保质期"逻辑对定期清理特别有用,后面会讲怎么挂到 cron 上。
按模式定点删除,而不是全部清空。有时候你只想从回收站里挑出某一类文件彻底删掉,trash-rm干的就是这件事:
trash-rm "*.tmp" trash-rm "/home/you/tmp/trash-demo/*"它的匹配规则基于原始路径:以/开头的模式匹配完整路径,否则匹配文件名。这里有一个新手必踩的坑——模式一定要加引号。不加引号的话,Shell 会在命令执行前就把*.tmp展开成当前目录下的文件列表,trash-rm收到的是文件名而不是模式,结果完全不是你想要的行为。
容易被忽略的两个坑
坑一:回收站允许同名文件共存,靠后缀区分。如果你先后删除两个同名文件,比如两次trash-put report.pdf,第二个文件在files/里会自动改名成report_1.pdf,依次递增。这个细节平时无感,但如果你用脚本直接扫描files/目录做统计,就会被后缀搞晕。好在trash-list和trash-restore都基于.trashinfo工作,展示的始终是原始路径,所以所有操作都应该走这几个命令,而不是直接翻files/目录。
坑二:trash-put和rm的参数语义不同。有人习惯给rm加别名指向trash-put,项目文档里明确不建议这么做——两者语义并不完全一致,比如rm删目录需要-r,而trash-put不需要,混用别名会让行为变得难以预测。更好的替代方案是让rm在敲下去之前"拦你一下":
alias rm='echo "This is not the command you are looking for."; false'真想用rm时,前面加反斜杠绕过别名即可:\rm file。这个别名只在交互式 Shell 里生效,不会影响脚本里的正常rm调用。
把回收站接进自动化:定时清理与脚本集成
trash-cli 的另一个重要场景是脚本和定时任务。比如给回收站设置"30 天自动过期",一行 cron 就能搞定:
(crontab -l ; echo "@daily $(which trash-empty) 30") | crontab -以后每天都会自动清掉超过 30 天的回收站文件,旧文件既不占空间,新误删的又还在保质期内。写进部署脚本时,trash-put因为不会真的删数据,比rm安全得多;配合trash-list做巡检、trash-restore做救援,就构成了一套完整的"删除生命周期管理"。
源码层面如果想了解命令的组装方式,入口分别在trashcli/put/main.py(trash-put)、trashcli/list/(trash-list)、trashcli/restore/(trash-restore),想改行为、加功能可以从这几个目录入手。
下一步行动清单
如果你刚接触 trash-cli,按这个顺序上手最快:
- 装好之后,用本文的示例把"删除 → 列表 → 恢复"完整跑一遍,记住恢复要输入序号;
- 把
trash-put纳入日常习惯,替代那些"可能还要反悔"的rm调用; - 给回收站设一个定时清理任务,避免只进不出;
- 把
trash-rm "*.模式"的引号规则写进团队文档,这是最常见的误用点; - 排查存量脚本:凡是直接删文件的地方,评估是否值得换成先入回收站再定期清空的模式。
误删是每个终端用户的必修课,trash-cli 不能让你不犯错,但能让错误变得可以挽回——这大概是对"删除"这件事最好的设计。
【免费下载链接】trash-cliCommand line interface to the freedesktop.org trashcan.项目地址: https://gitcode.com/gh_mirrors/tr/trash-cli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考