-
博文分类专栏
- Jquery基础教程
-
- 文章:(15)篇
- 阅读:46601
- shell命令
-
- 文章:(42)篇
- 阅读:154385
- Git教程
-
- 文章:(36)篇
- 阅读:234996
- leetCode刷题
-
- 文章:(76)篇
- 阅读:132062
-
改写Linux下的rm删除命令2017-08-09 18:06 阅读(7800) 评论(0)
概述
针对Linux而已,文件一旦被删除了,往往很难恢复的。上次本想是删除错误日志的,结果没有切换到日志对应的目录,执行了rm -rf * 把整个项目给删了,虽然可以从git上面重新pull,但是好几天没有push,改了那么多的程序都没了,万幸的是从编辑器IntelliJ IDEA历史记录中,恢复了很多。于是下定决心,要改写rm命令,同样的坑,不能再次掉进去啊。
思路:把要删除得文件,移动到指定的目录,若误删,则从该目录中找回删除得文件,即可。
脚本编写
于是乎,写了下面的shell脚本(.rm.sh):
#version : 1.0 #author : dqs<www.findme.wang> # 删除文件 #主要功能,将文件已到指定的目录 #缺陷:当转移的目录中已经存在需要转移的文件时,尚未处理 recycle_dir=~/.recycle if ! [ -d $recycle_dir ] then mkdir $recycle_dir echo "创建目录$recycle_dir 保存删除得文件" ... ok chmod 777 $recycle_dir echo "修改权限" ..ok fi #将需要删除得文件移到该目录 file_dir=$(cd `dirname $1`; pwd) file_name=`basename $1` rmFiles="$file_dir/$file_name" cur_date=`date +%Y%m%d` save_dir="$recycle_dir/$cur_date"; if ! [ -e $save_dir ] then mkdir $save_dir chmod 777 $save_dir fi save_dir="$save_dir/$file_name" if [ -e $rmFiles ] then if [ -e $save_dir ] then echo "$save_dir已经存在,可以通过-f选项移除之前的文件" else mv $rmFiles $save_dir if [ $? -eq 0 ] then rm -rf $rmFiles echo "$rmFiles已经成功删除...若想恢复,请到$save_dir中查找" #添加日志 logTime=`date "+%Y-%m-%d %H:%M:%S"` curUser=`whoami` echo "[$curUser] $logTime $rmFiles ====> $save_dir" >> "$recycle_dir/del.log" else echo "请使用相对目录删除" fi fi else echo "你没有权限或是文件不存在哦!!!" fi
于是,经过测试,通过以下方式
./.rm.sh 要删除得文件或是文件夹
的确可以删除文件,并把删除记录添加到~/.recycle/del.log文件夹中如下:
但是,如果每次删除文件都这么搞,是不是有点麻烦呢?
定义删除命令
打开~/.bashrc文件,添加如下一行代码
(备注:也可以使用alias rm=~/.rm.sh这样,系统自带的rm命令就变成了自己的脚本命令了)
此时,是不是可以通过del +文件 来删除文件呢?
当然不是哦,还需要执行以下source .bashrm
因为这个文件,只会在你登录或是远程连接上的时候,才会执行一次,修改后并没有执行。
下面,开始删除文件试试
现在去文件保存目录瞅瞅,发现确实存在,看来达到了预期的效果
总结
这个删除功能已经完善了吗?当然不是啦!不知道有没有人注意到,其实,有一个问题,当我在创建一个test.html文件,在使用del命令删除的时候,会出现以下提示
其实,是因为我并没有处理文件同名的问题,也就是说同一天内,不能通过del删除同一个路径下的同一个文件,因为linux规定同一路径下不能存在同名文件,window系统也是这样的。但是我发现window系统回收站里面却可以存在同名的文件,如下:
关于这个问题,开始打算是通过删除上次备份的文件,但是觉得还是多思考一下。
此外,还有一个问题就是,不断的del了,删除备份文件会越来越多,占用过多空间,所以后期还需要写一个定时脚本,删除几天前或是几周或是上月等的日志。