我用trash-cli给Linux回收站装上命令行开关:一次误删事故换来的5个保命命令

📅 2026/8/15 17:45:04
我用trash-cli给Linux回收站装上命令行开关:一次误删事故换来的5个保命命令
我用trash-cli给Linux回收站装上命令行开关一次误删事故换来的5个保命命令【免费下载链接】trash-cliCommand line interface to the freedesktop.org trashcan.项目地址: https://gitcode.com/gh_mirrors/tr/trash-cli一个周五晚上的事故现场周五晚上十一点我盯着终端里滚过的输出后背发凉。三秒钟前一条本该精准删除临时文件的命令把整个projects/目录连根拔起——里面有我改了两个月还没提交的代码还有上周导出的客户数据。按下CtrlC已经来不及了。那一刻我脑子里只有一个问题Linux 的回收站在哪答案很残酷传统rm没有回收站文件被删除后直接释放几乎没有后悔药。但如果你的系统装上了 trash-cli命令行回收站就能像桌面环境的废纸篓一样工作。它提供 trash-put、trash-list、trash-restore、trash-empty、trash-rm 五把钥匙让删除从一次性的处决变成随时可以反悔的暂存。这篇文章就把我踩过的坑和总结出的经验全部写下来。为什么 rm 是条不归路先搞清楚问题的本质。rm的工作方式很直接解开文件系统里的链接把数据块标记为可复用。这带来两个连锁反应进程无法恢复——文件描述符一关数据就彻底脱管磁盘可能被覆盖——新写入的数据随时可能顶掉旧数据块即便用数据恢复工具也只能碰运气。所以我在事故后第一反应不是去查恢复工具而是反思为什么不用一个天然带反悔机制的删除方式这正是 FreeDesktop.org 回收站规范要解决的问题而 trash-cli 就是它在终端世界的实现。三步装好你的命令行回收站安装方式按场景选一种就行方式适用场景命令pip 安装有 Python 环境的常规用户pip install trash-clipipx 安装想隔离依赖、避免污染全局环境pipx install trash-cli源码安装想跟进最新提交或二次开发见下方代码块git clone https://gitcode.com/gh_mirrors/tr/trash-cli cd trash-cli pip install .装完后验证一下看到版本号就说明环境通了$ trash-put --version trash-put 0.24.0第一课trash-put把删除变成暂存事故之后我给自己定了一条铁律凡是拿不准的文件一律先送进回收站而不是直接rm。trash-put 的用法和 rm 几乎一样但行为天差地别# 单个文件进回收站 $ trash-put report_v2.docx # 批量处理glob 通配符照常工作 $ trash-put *.log temp_dir/ # 文件不在时静默跳过不报错也不返回非零状态 $ trash-put -f maybe_missing.txt为什么这么设计回收站不是简单地把文件挪个位置。trash-put 会为每个文件写一个.trashinfo元数据文件记录它原来的完整路径、删除时间和权限信息。桌面文件管理器里看到的原始位置就来自这份档案。这也决定了后续 trash-list、trash-restore 能做什么——没有它恢复就等于大海捞针。一个常见坑trash-put 不支持跨文件系统移动。如果目标文件所在的磁盘和回收站不在同一分区你会收到错误提示。这一点我在后面回收站到底藏在哪一节展开讲。第二课trash-list随时清点回收站事故第二天我做的第一件事就是确认抢救范围。trash-list 会按删除时间 原始路径的格式把回收站里所有条目列出来$ trash-list 2026-08-13 21:42:18 /home/lin/projects/webapp/src/config.py 2026-08-13 21:42:18 /home/lin/projects/webapp/src/main.py 2026-08-12 09:15:03 /home/lin/meeting_notes.md 2026-08-10 17:33:44 /home/lin/downloads/old_package.tar.gz配合 grep 就能快速定位目标比在图形界面里一个个翻文件夹高效得多$ trash-list | grep projects/webapp 2026-08-13 21:42:18 /home/lin/projects/webapp/src/config.py 2026-08-13 21:42:18 /home/lin/projects/webapp/src/main.py看到两条记录都在我悬着的心放下一半。tiptrash-list 输出的每一列都有用——第一列是删除时间第二列是文件当初所在的位置。如果你怀疑回收站里有重复文件同名不同路径被删过多次时间戳就是区分它们的关键线索。第三课trash-restore把文件捞回来这是整套工具里我最想安利的一个。直接运行trash-restore它会列出全部条目并进入交互模式$ trash-restore 0 2026-08-13 21:42:18 /home/lin/projects/webapp/src/config.py 1 2026-08-13 21:42:18 /home/lin/projects/webapp/src/main.py 2 2026-08-12 09:15:03 /home/lin/meeting_notes.md What file to restore [0..2]: 0输入序号回车文件就回到它原来的位置。一次恢复多个文件交互模式远不止单选。它支持逗号分隔和区间语法也就是可以这样输入What file to restore [0..2]: 0,1甚至用区间一次捞回一大片What file to restore [0..5]: 2-5如果输入了超出范围的编号或乱写字符工具会报Invalid entry并终止本次操作不会误伤任何文件——这个容错设计在脚本里尤其让人安心。按路径定向恢复回收站条目多的时候交互列表会很长。这时可以直接把目标路径作为参数传给 trash-restore它只会列出与这个路径相关的条目$ trash-restore /home/lin/projects/webapp 0 2026-08-13 21:42:18 /home/lin/projects/webapp/src/config.py 1 2026-08-13 21:42:18 /home/lin/projects/webapp/src/main.py What file to restore [0..1]:恢复时可能遇到的两个拦路虎目标位置已有同名文件默认情况下 trash-restore 会拒绝覆盖提示位置被占用。确认旧文件确实没用了再加--overwrite参数强制覆盖。恢复目标被删除如果文件当初所在的目录已经不在了恢复会失败。我的经验是先mkdir -p把目录结构补回来。另外--sort参数可以改变候选列表的排序方式--sort date默认按删除时间、--sort path按原始路径、--sort none不排序。路径相同的条目排在一起后批量恢复同名文件会直观很多。第四课trash-empty给回收站瘦身回收站不是无底洞它占用的磁盘空间不会自动归还。trash-empty 负责清理而且支持按天数精准清理# 全部清空慎用不可恢复 $ trash-empty # 只清空 30 天前进入回收站的文件 $ trash-empty 30⚠️血的教训trash-empty不带参数是永久删除进了这个命令的文件没有回头路。我建议把加天数变成肌肉记忆——trash-empty 7只清一周前的给误删留足缓冲期。配合 crontab 就能实现自动化维护我放在第五部分讲。第五课trash-rm定向清除指定文件有时不想清空整个回收站只想删掉某一类。trash-rm 用模式匹配来完成这个任务它匹配的是回收站条目的原始路径# 按文件名精确匹配 $ trash-rm report_v2.docx # 通配符匹配所有 .o 中间文件 $ trash-rm *.o # 按完整原始路径匹配 $ trash-rm /home/lin/projects/legacy执行前先跑一遍trash-list | grep确认模式会命中哪些条目是成本最低的防误删手段。回收站到底藏在哪一张表看懂目录规则这部分是我被坑得最惨的地方。trash-cli 不是把所有东西都塞进一个目录而是遵循 FreeDesktop.org 规范的分区策略文件来源回收站位置家目录所在分区~/.local/share/Trash/若设置了$XDG_DATA_HOME则用$XDG_DATA_HOME/Trash其他分区的挂载点$top_dir$top_dir/.Trash/$uid要求.Trash目录带 sticky 位上述条件不满足时$top_dir/.Trash-$uid这段规则意味着什么你删除 U 盘或移动硬盘上的文件时回收站不在家里而是在那块盘自己身上。所以U 盘删了文件想找回来得先把 U 盘插回原电脑、回到原挂载点才行。这也是 trash-put 跨分区会失败的底层原因——元数据和真实文件必须待在同一卷上。用ls ~/.local/share/Trash/就能看到回收站的内部结构files/目录放真实文件info/目录放对应的.trashinfo档案两个目录一一对应。进阶把命令行回收站变成日常习惯工具再好不用等于零。我总结了三件让这套工具真正长在身上的小事1. 给 rm 加一道提示闸门。用 shell 别名拦截手滑alias rmecho 请改用 trash-put 或 trash-rm; false在~/.bashrc或~/.zshrc里加上这一行从此rm只会打出一句提醒真正要彻底删除时再用/bin/rm显式执行。2. 每天自动清理一周前的垃圾。把定时任务挂进 crontab(crontab -l ; echo 0 3 * * * /usr/local/bin/trash-empty 7) | crontab -凌晨三点自动执行回收站永远只保留最近七天的文件磁盘空间不至于被悄悄吃光。3. 定期体检回收站。我习惯每周跑一次trash-list | wc -l # 回收站里有多少个条目 du -sh ~/.local/share/Trash/files/ # 实际占用多少空间数字异常偏大就说明有程序在偷偷往回收站塞东西值得排查。五个命令一张速查表把这一路用到的能力汇总成表方便贴在手边命令干什么最常用形态危险等级trash-put把文件/目录移入回收站trash-put -f *.tmp低可恢复trash-list列出回收站内容trash-list \| grep keyword无trash-restore恢复回收站文件trash-restore输入0-2低注意覆盖trash-empty清空回收站trash-empty 30高永久删除trash-rm按模式删除回收站条目trash-rm *.o高永久删除现在就去装一个那次周五的事故最终靠 trash-restore 全须全尾地救了回来——config.py 和 main.py 一行没少。但真正让我安心的是那个晚上养成的习惯删除之前先想想有没有必要断掉退路。命令行回收站改变的不是某个命令而是你和删除这件事的关系——从一次性的决定变成随时可以撤销的步骤。三分钟装好 trash-cli把rm的别名改掉再配一条 crontab这三件事做完下一次误删就会变成虚惊一场而不是彻夜难眠。【免费下载链接】trash-cliCommand line interface to the freedesktop.org trashcan.项目地址: https://gitcode.com/gh_mirrors/tr/trash-cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考