1. GNOME/GUI 桌面环境的回收站
桌面环境(GNOME、KDE、XFCE等)提供了回收站功能:
-
位置 :
~/.local/share/Trash/ -
结构:
~/.local/share/Trash/
├── files/ # 存放被删除的文件
├── info/ # 存放元数据信息(删除时间、原路径等)
└── expunged/ # 已永久删除的文件 -
文件格式:
info 目录下的 .trashinfo 文件示例
[Trash Info]
Path=/home/user/documents/test.txt
DeletionDate=2024-01-15T10:30:00
2. 命令行删除工具的回收站实现
(1)trash-cli 工具(最常用)
# 安装
sudo yum install trash-cli # CentOS/RHEL
sudo apt install trash-cli # Ubuntu/Debian
# 使用命令
trash-put file.txt # 移动到回收站
trash-list # 查看回收站内容
trash-restore # 恢复文件(交互式)
trash-empty # 清空回收站
trash-rm file.txt # 从回收站删除特定文件
# 设置别名(替代 rm)
alias rm='trash-put'
(2)rmtrash 命令
# 安装(macOS 常用,Linux 也可用)
# 使用
rmtrash file.txt # 移动到回收站
(3)离线安装方式
[root@b trash-cli]# git clone https://github.com/andreafrancia/trash-cli.git
[root@b trash-cli]# cd trash-cli
[root@b trash-cli]# pip install .
[root@b trash-cli]# export PATH=~/.local/bin:"$PATH"
方案二:自定义回收站脚本
创建 ~/bin/trash.sh:
#!/bin/bash
# 更完善的回收站脚本
TRASH_DIR="$HOME/.trash"
MAX_DAYS=30 # 自动清理30天前的文件
# 创建回收站目录
mkdir -p "$TRASH_DIR"
case "$1" in
put)
# 移动文件到回收站
for file in "${@:2}"; do
if [ -e "$file" ]; then
base_name=$(basename "$file")
timestamp=$(date +%Y%m%d_%H%M%S)
dest_name="${base_name}_${timestamp}_$$"
# 移动文件
mv "$file" "$TRASH_DIR/$dest_name"
# 保存元数据
cat > "$TRASH_DIR/.${dest_name}.info" <<EOF
ORIG_PATH=$(realpath "$file")
DEL_DATE=$(date +"%Y-%m-%d %H:%M:%S")
EOF
echo "已删除: $file"
fi
done
;;
list)
# 列出回收站内容
echo "回收站内容:"
echo "=========="
for info_file in "$TRASH_DIR"/.*.info; do
if [ -f "$info_file" ]; then
orig_path=$(grep '^ORIG_PATH' "$info_file" | cut -d= -f2)
del_date=$(grep '^DEL_DATE' "$info_file" | cut -d= -f2)
trash_file=$(basename "$info_file" .info)
trash_file=${trash_file#.}
size=$(du -h "$TRASH_DIR/$trash_file" 2>/dev/null | cut -f1)
echo "[$del_date] $orig_path ($size)"
fi
done
;;
restore)
# 恢复文件
if [ -z "$2" ]; then
echo "请提供要恢复的文件名(不带路径)"
exit 1
fi
# 查找匹配的文件
matches=()
for file in "$TRASH_DIR"/$2*; do
if [ -f "$file" ] && [[ "$file" != *.info ]]; then
matches+=("$file")
fi
done
if [ ${#matches[@]} -eq 0 ]; then
echo "未找到匹配的文件"
elif [ ${#matches[@]} -eq 1 ]; then
info_file="$TRASH_DIR/.$(basename ${matches[0]}).info"
orig_path=$(grep '^ORIG_PATH' "$info_file" | cut -d= -f2)
mv "${matches[0]}" "$orig_path"
rm -f "$info_file"
echo "已恢复: $orig_path"
else
echo "找到多个匹配文件:"
select file in "${matches[@]}"; do
info_file="$TRASH_DIR/.$(basename $file).info"
orig_path=$(grep '^ORIG_PATH' "$info_file" | cut -d= -f2)
mv "$file" "$orig_path"
rm -f "$info_file"
echo "已恢复: $orig_path"
break
done
fi
;;
empty)
# 清空回收站
read -p "确定要清空回收站吗?所有文件将永久删除!(y/N): " confirm
if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
rm -rf "$TRASH_DIR"/*
echo "回收站已清空"
fi
;;
clean-old)
# 清理旧文件
find "$TRASH_DIR" -type f -mtime +$MAX_DAYS -delete
find "$TRASH_DIR" -name ".*.info" -mtime +$MAX_DAYS -delete
echo "已清理 $MAX_DAYS 天前的文件"
;;
*)
echo "用法:"
echo " trash put <文件...> # 删除文件到回收站"
echo " trash list # 列出回收站内容"
echo " trash restore <文件名> # 恢复文件"
echo " trash empty # 清空回收站"
echo " trash clean-old # 清理旧文件"
;;
esac
设置权限并创建别名:
chmod +x ~/bin/trash.sh
echo "alias rm='~/bin/trash.sh put'" >> ~/.bashrc
echo "alias trash='~/bin/trash.sh'" >> ~/.bashrc
source ~/.bashrc
4. 服务器环境的最佳实践
对于生产服务器,建议:
(1)使用 safe-rm 工具
# 安装 safe-rm
sudo apt install safe-rm # Debian/Ubuntu
# 或从源码编译
# 配置保护目录
sudo vi /etc/safe-rm.conf
# 添加要保护的目录
/
/etc
/home
/usr
/var
(2)使用 git 作为文件版本控制
# 初始化 git 仓库
cd /important/directory
git init
git add .
git commit -m "初始提交"
# 删除文件前先提交
git add -A
git commit -m "删除前的状态"
(3)使用备份策略
# 定期备份
tar -czf /backup/$(date +%Y%m%d).tar.gz /path/to/data
# 使用 rsync 做增量备份
rsync -av --delete --backup --backup-dir=/backup/incremental/$(date +%Y%m%d) \
/source/ /destination/
(4)设置 rm 别名警告
# 在 ~/.bashrc 中添加
alias rm='rm -i' # 删除前询问确认
alias cp='cp -i' # 覆盖前询问
alias mv='mv -i' # 移动前询问
5. extundelete 工具(文件恢复)
如果误删了文件,可以尝试恢复:
# 安装 extundelete(适用于 ext3/ext4 文件系统)
sudo yum install extundelete # CentOS/RHEL
sudo apt-get install extundelete # Ubuntu/Debian
# 卸载分区(重要!)
sudo umount /dev/sda1
# 扫描可恢复文件
sudo extundelete /dev/sda1 --restore-all
# 恢复特定文件
sudo extundelete /dev/sda1 --restore-file /path/to/file
# 恢复特定目录
sudo extundelete /dev/sda1 --restore-directory /path/to/dir
6. 重要提醒
-
立即停止写入操作:误删文件后,立即停止对相应分区的写入
-
使用只读模式挂载 :
mount -o ro /dev/sdX /mnt/recover -
定期备份:最可靠的"回收站"是定期备份
-
测试恢复流程:定期测试文件恢复流程是否有效
总结建议
-
桌面用户 :使用系统自带的回收站或安装
trash-cli -
服务器用户 :使用
rm -i别名 + 定期备份策略 -
开发环境:使用版本控制系统(git)管理重要文件
-
生产环境:建立完善的备份和恢复机制,避免依赖回收站