前几天登录到家里软路由上整理我的nas硬盘,准备把不太需要的东西删一删,需要的东西搬到新搭建的nas服务器上,期间总在使用du -sh ./*
查看文件大小,同时也在使用rm -rf
删除一些不需要的文件,这时在操作一个比较大的文件夹时,不小心把命令输入错了并顺手敲了回车,当时人就傻了。
解决方案
这还解决个毛线啊,远程操作也拔不了硬盘了,救是救不回来了,反正看了下也不是特别重要的文件,就放弃这些数据了。但是为了防止此类事情的再次发生,决定把rm
命令的操作逻辑换掉,改成移动到回收站,后续有机会再手动物理删除,就类似windows的回收站。
创建回收站
找一个空间还比较大的目录,比如我这里是/mnt/m2
,创建回收站文件夹
mkdir -p /mnt/m2/trash
chmod 777 /mnt/m2/trash
创建安全删除脚本
新建一个脚本,比如 /usr/local/bin/safe_rm
:
#!/bin/sh
TRASH_DIR="/mnt/m2/trash"
# 时间戳目录避免重名覆盖
TODAY=$(date +%Y-%m-%d_%H-%M-%S)
DEST="$TRASH_DIR/$TODAY"
mkdir -p "$DEST"
# 遍历参数
for target in "$@"; do
# 忽略选项 -r -f -v 等
case "$target" in
-*) continue ;;
*)
if [ -e "$target" ]; then
mv "$target" "$DEST"/
fi
;;
esac
done
赋予权限:chmod +x /usr/local/bin/safe_rm
替换rm命令
在 /etc/profile
里加:
alias rm='/usr/local/bin/safe_rm'
保存后,执行source /etc/profile
,当前登录的shell 就生效了
再次操作rm
命令就会把目标文件夹或文件移动到/mnt/m2/trash
文件夹了,如果要物理删除文件,可以指定原始的rm脚本:/bin/rm
定期自动清理回收站
这里可以创建一个crontab任务,比如执行:crontab -e
,增加:
0 3 * * * find /mnt/sda1/trash -type d -mtime +7 -exec rm -rf {} +
意思是每天凌晨 3 点清理 7 天前的文件,这样OpenWrt 上的 rm -rf
就会变成移动到回收站,并自动定期清理了。
当然你也可以不定时清理,每次都手动清理,就跟windows上差不多,其他系统也是类似的。
后记
但是工作中的正式服务器上还是不太推荐这种方式去操作的,因为以下几种原因:
- 某些脚本运行可能依赖
rm
,导致一些未知错误 - 如果养成习惯觉得
rm
永远安全,其实在别的服务器(没有 alias)上执行就真删了
最好还是养成好习惯,不要使用rm
命令,而是使用其他命令代替它,比如上面新建的safe_rm,或者第三方的现成工具 trash-cli
等,严格的区别物理删除与移动回收站操作,才是真正的好习惯。
评论区