可恢复的安全rm
我们常常使用rm去删除一些文件。假设不小手一抖,那么就悲剧了。你们都懂的。。。
在经历过一次这种慘剧后。决定永远杜绝这种情况。重写写了shell函数。运行安全的rm。这个函数会把要删除的文件按日期备份到指定的文件夹,同一时候依据删除时间的不同会有多个版本号,同一时候提供了另外一个函数用于恢复之前删除的文件。
# safe rm
# Don't remove the file, just move them to a temporary directory.
# Files are grouped by remove time.
# e.g.
# # pwd => /home/work/
# > rm -r -f aa
# 'aa' will move to ~/.TrashHistory/20141018/aa@120111@_home_work_aa
_RM_BACKUP_PATH=/Users/louzhenlin/.TrashHistory
function safe_rm() {
# skip cmd option, e.g. '-rf' in 'rm -rf a b' or '-r/-f' in 'rm -r -f a b'
local first_char=${1:0:1}
until [ ! "$first_char" = "-" ]
do
shift
first_char=${1:0:1}
done # check param
if [ $# -lt 1 ]; then
echo 'usage: rm [-f | -i] [-dPRrvW] file ...'
exit 1
fi local today=`date +"%Y%m%d"`
local mvpath=${_RM_BACKUP_PATH}/$today # support for multi version
local timestamp=`date +"%H%M%S"` # create dir if path non-exist
if [ ! -d $mvpath ]; then
mkdir $mvpath
fi until [ $# -eq 0 ]
do
# fetch absolute path of the file
local file_path=$1
local fchar=`echo "${file_path:0:1}"`
if [ "$fchar" = "/" ]; then
local dist_path="_${file_path}"
else
local abs_fpath=`pwd`/$file_path
local dist_path="${file_path}@${timestamp}@${abs_fpath}"
fi # substitue '/' to '_'
local final_dist_path=${dist_path//\//^} # mv to temp trash
mv $file_path $mvpath/$final_dist_path # next file
shift
done
}
上面是safe_rm函数,在备份文件夹下显示:
➜ ~ ll ~/.TrashHistory/20141021
total 32
drwxr-xr-x 7 louzhenlin staff 238 10 21 18:01 .
drwxr-xr-x 5 louzhenlin staff 170 10 21 15:51 ..
-rw-r--r-- 1 louzhenlin staff 136 10 20 23:39 a@180117@^Users^louzhenlin^dev^workspace^c_cpp^leveldb^a
-rw-r--r-- 1 louzhenlin staff 399 10 14 17:43 aof.log@164609@^Users^louzhenlin^dev^workspace^python^redis^aof^modifer^aof.log
-rw-r--r-- 1 louzhenlin staff 0 10 14 11:19 appendonly-1.aof@155727@^Users^louzhenlin^dev^server^redis-2.8.17^appendonly-1.aof
-rw-r--r-- 1 louzhenlin staff 399 10 14 17:42 appendonly.aof@155105@^Users^louzhenlin^dev^server^redis-2.8.17^appendonly.aof
-rw-r--r-- 1 louzhenlin staff 565 10 21 15:56 appendonly.aof@161315@^Users^louzhenlin^dev^server^redis-2.8.17^appendonly.aof
能够看到,文件里包括时间以及全路径信息,以便用于恢复。
以下是用于恢复的函数:
# revert files that remove by safe_rm
# you can choose the right one in multi files removed
function revert_rm() {
# process multi files
until [ $# -eq 0 ]
do
echo "revert for $1:"
for _f in `find $_RM_BACKUP_PATH -name "$1@*" -print`
do
local d=`echo $_f | awk -F\/ '{print $2}'`
local t=`echo $_f | awk -F@ '{print $2}'`
local file_path=`echo $_f | awk -F@ '{print $3}'`
file_path=${file_path//^/\/} echo -n " $file_path at ${d:0:4}-${d:4:2}-${d:6:2} ${t:0:2}:${t:2:2}:${t:4:2} [y/n]? "
read _confirm
if [ "${_confirm}" = 'y' ]; then
mv $_f $file_path
break
fi
done shift
done
}
revert_rm会将多个版本号的文件列出来。用于选择想要恢复的那个。
➜ ~ revert_rm appendonly.aof
revert for appendonly.aof:
/Users/louzhenlin/dev/server/redis-2.8.17/appendonly.aof at 2014-10-21 15:51:05 [y/n]? n
/Users/louzhenlin/dev/server/redis-2.8.17/appendonly.aof at 2014-10-21 16:13:15 [y/n]? y
使用时。能够建立一个alias将rm指向safe_rm就可以。希望大家用的开心哈。
可恢复的安全rm的更多相关文章
- Linux之文件恢复[extundelete,针对rm]
[恢复过程] 1.下载+安装extundelete cd /tmp wget wget http://jaist.dl.sourceforge.net/project/extundelete/extu ...
- Ubuntu中恢复rm命令误删文件(转)
计算机系统:Ubuntu 16.04 1 背景 在做项目的时候,本来想使用rm命令删除以14开头的文件,结果写成如下形式: rm 14 * 注意,本来14和*之间不应该有空格的,但是误写了一个空格,结 ...
- Ubuntu 16.04使用rm -rf误删文件恢复方法收集
说明:不一定有效,需要不断尝试 一.lsof 文件刚刚被删除,想要恢复,先尝试lsof. lsof |grep data.file1 cp /proc/xxx/xxx/xx /dir/data.fil ...
- 将linux下的rm命令改造成移动文件至回收站【转】
转自:http://blog.csdn.net/a3470194/article/details/16863803 [-] 将linux下的rm命令改造成移动文件至回收站 将AIX下的rm命令改造成移 ...
- 使用grep恢复被删除文件内容【转】
http://www.cnblogs.com/ggjucheng/archive/2012/10/07/2714311.html Unix/Linux下,最危险的命令恐怕就属rm命令了,每次在root ...
- OCP读书笔记(6) - 手动恢复操作
6.Restore and Recovery Task 非关键性文件丢失的恢复 临时文件丢失的恢复 临时表空间文件丢失的恢复: 查看数据库中的临时文件: SQL> select file#,ST ...
- Linux学习之CentOS(十八)-----恢复Ext3下被删除的文件与 使用grep恢复被删文件内容(转)
前言 下面是这个教程将教你如何在Ext3的文件系统中恢复被rm掉的文件. 删除文件 假设我们有一个文件名叫 'test.txt' $ls -il test.txt 15 -rw-rw-r– 2 roo ...
- NTFS(Windows)、ext4(RHEL6)和xfs(RHEL7)文件系统的误删除恢复和备份
前言 对于误删除文件的设备,要马上停止任何写的操作,防止删除的文件被覆盖,导致数据丢失! 恢复NTFS文件系统下误删的文件 以Windows为例,市面上能恢复的工具不少,例如EasyRecovery. ...
- 使用grep恢复被删文件内容
在Unix/Linux下,最危险的命令恐怕就属rm命令了,每次在root下使用这个命令的时候,我都要盯着命令行看上几分钟才敢把回车敲下去.以前,看到同事在脚本中使用rm命令 —— rm {$App_D ...
随机推荐
- Vue组件之间通信的三种方式
最近在看梁颠编著的<Vue.js实战>一书,感觉颇有收获,特此记录一些比价实用的技巧. 组件是MVVM框架的核心设计思想,将各功能点组件化更利于我们在项目中复用,这类似于我们服务端面向对象 ...
- day21-1 类的继承
目录 类的继承 什么是继承 为什么用继承 对象的继承 继承与抽象 继承的应用 对象属性查找顺序 类的继承 什么是继承 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承) ...
- Microsoft SQL Server 存储过程
Microsoft SQL Server 存储过程 TRIGGER DDL触发器:主要用于防止对数据库架构.视图.表.存储过程等进行的某些修改:DDL事件是指对数据库CREATE,ALTER,DROP ...
- Python 操作excel day5
一.Python操作excel python操作excel使用xlrd.xlwt和xlutils模块 1.xlrd模块是读取excel的: 2.xlwt模块是写excel的: 3.xlutils是用来 ...
- (C/C++学习)14.C语言字符串处理函数(二)
说明:上节着重解释了字符串处理的库函数处理,这节将针对一些常用的需求,进行非库函数的处理. 一.去除某一个字符串中的某个字符 1.去除字符串右边的空格 void trimStrRightSpace(c ...
- UVA12118 Inspector's Dilemma(欧拉路径)
题目: 某个国家有V(V≤1000)个城市,每两个城市之间都有一条双向道路直接相连,长度为T(每条边的长度都是T).你的任务是找一条最短的道路(起点和终点任意), 使得该道路经过E条指定的边.输出这条 ...
- 以gnome-terminal为例,修改gnome3 的默认配置
gnome连续几个版本的terminal默认配置文件都是同一个配置文件“b1dcc9dd-5262-4d8d-a863-c897e6d979b9”.这是因为gnome的developers编辑了这个配 ...
- Linux 查看发行版版本信息和内核版本
版本信息: cat /etc/centos-release 或 redhat-release cat /etc/issiue 内核信息:uname -r 或 uname -a
- 深入理解PHP之strpos
概述 在php中经常用 strpos 判断字符串是否在另一个字符串中存在, 本文介绍 strpos 函数及其实现. strpos应用 <?php /* strpos示例 */ // test e ...
- Python条件控制语句
条件控制语句 if语句 if条件加表达式 if-else语句 if-elif-else语句 if 表达式1: 语句1 elif 表达式2: 语句2 elif 表达式3: 语句3 else: 语句e 逻 ...