防止误删文件!将rm命令改造成mv命令简易版

时间:2022-12-31 11:31:44

    今天在用rm -rf的时候突发奇想,如果我一不小心删错了该咋办,平时粗心大意的我感觉自己很容易犯这样的错误。于是去百度搜了一下,发现好多人都犯过这种错误!有的还带来很大的损失!而且rm命令删除文件之后很难恢复。

    所以很多人建议用alias将rm替换成mv,也就是设置一个自己的垃圾桶,在rm的时候将文件移动到垃圾桶中而不是直接删除了。这样就相当于有了备份。而这个垃圾桶可以crontab设置定时任务一周清除一次,通过这种方式就可以避免手残带来的损失。

    了解大体思路之后我就自己改造了一下rm命令,没做多少测试,先自己将就用着,有bug再说吧,我的系统是macOs,跟linux应该大同小异。


首先来改alias,将rm命令替换为我自己写的脚本,macOs上没找到alias命令,于是我修改了/etc/profile文件,这个文件每次开机的时候会被读取,对所有用户有效,修改如下:

alias rm='sh /Users/db/rm_delete_files/trash.sh'

其实就是执行指定目录下的脚本。

然后就是脚本的代码,开始犯的错是以为传给脚本的参数只有最多两个,然而我在rm -f test.*的时候发现参数并不是两个,而是等于符合test.*形式的文件的个数,所以代码最后来了个while循环遍历mv:

#!/bin/sh

date=`date +%F` #当前日期
path="/Users/db/rm_delete_files/"$date

if [ ! -d $path ]; then
mkdir $path #创建一个目录
fi

str=$1 #第一个参数
first_char=${str:0:1}
if [ $first_char = '-' ];then #第一个参数是-f或者-rf,shift到第二个参数
shift
fi

while [ $# != 0 ]; #遍历所有的参数,mv到指定path
do
mv -f $1 $path
shift
done


暂时测的case还不多,可能还不够完善。能支持类似于rm -f test.c 、rm -rf  dir、rm test.c、rm -f test*、rm -rf dir/*等删除命令,但是不支持参数分开写的比如 rm -f -r dir等。

日后再逐渐完善,这样做了保障就不怕自己以后手残啦。



ps:好像定时删除垃圾桶还没做,等有时间再做吧。