linux无系统级回收站,需用trash-cli替代rm实现删除进回收站,它兼容桌面环境、保留原始路径;自定义mv别名是轻量替代方案但不兼容trash-restore。

Linux 没有系统级回收站机制,rm 默认就是永久删除;要实现“删除进回收站”,必须拦截或替换 rm 的行为,核心是把移动(mv)当作删除的代理动作,并保留元数据。
用 trash-cli 替代 rm(推荐方案)
这是最稳妥、兼容性最好、且与 GNOME/KDE 回收站目录结构一致的方式。它自动写入 ~/.local/share/Trash/files/ 和 ~/.local/share/Trash/info/,恢复时能还原原始路径。
- 安装:
sudo apt install trash-cli(Debian/Ubuntu)或sudo yum install trash-cli(RHEL/CentOS) - 别名配置(加到
~/.bashrc):alias rm='trash-put' - 立即生效:
source ~/.bashrc - 注意:
trash-put不支持-rf这类rm选项,直接传路径即可;想批量删,用trash-put file1 dir2 *.log - 恢复文件:
trash-restore是交互式命令,会列出所有被删项并编号,输入数字即可还原原位置
自定义 mv 别名(轻量应急方案)
适合无法联网、无 root 权限、或只想快速试水的场景,但不保存原始路径,恢复需手动复制。
- 创建回收站目录:
mkdir -p ~/.trash - 设置别名(
~/.bashrc):alias rm='mv -t ~/.trash --backup=numbered' -
--backup=numbered可避免同名文件覆盖(如file.txt.~1~),比裸mv更安全 - 此方式对带空格或特殊字符的路径支持较差;
rm -r dir会失败,因为mv -t不接受递归标志 - 定时清理建议用:
find ~/.trash -type f -mtime +30 -delete,加到 crontab 即可
注意:alias 不生效的常见情况
alias rm='trash-put' 只在交互式 bash 中起作用,以下场景完全无效:
- 脚本中直接调用
rm(未 source ~/.bashrc,也未设 shebang 为#!/bin/bash -i) - crontab 任务里执行的
rm(cron 使用 /bin/sh,不读 bashrc) - sudo 执行的
rm(默认不继承当前用户 alias) - 解决办法:脚本里明确写
trash-put;cron 里用绝对路径/usr/bin/trash-put;sudo 时加-E保持环境变量(但不保证 alias 生效,仍建议直写命令)
多用户服务器上的隔离要点
共用服务器时,不能让所有用户共享一个回收站目录,否则权限混乱、隐私泄露、空间争抢。
- trash-cli 支持 per-user 隔离,默认就走
$HOME/.local/share/Trash,无需额外配置 - 若用自定义方案,务必为每个用户设独立路径,例如
/var/recycle/$USER/,并chmod 700限制访问 - root 用户应单独配置——不要把
sudo rm指向普通用户的~/.trash,否则可能误删系统关键文件 - 回收站容量无自动限制,长期运行必须配
trash-empty --days 7或find ... -mtime +7 -delete定时清理
真正容易被忽略的是:图形界面(GNOME/KDE)和命令行工具(trash-put)虽然共用 ~/.local/share/Trash,但桌面环境删除的文件,trash-restore 能恢复;而用 mv 别名扔进 ~/.trash 的文件,trash-restore 根本看不到——路径和元数据格式完全不同。混用两种方式等于自己挖坑。











