可恢复的安全rm
2024-09-07 23:11:59
我们常常使用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就可以。希望大家用的开心哈。
最新文章
- 【专业找水题】状压dp最水题,没有之一
- Deepin 15.3 编译同步SudaMod 2.0
- Spring的3种切入点PointCut实现
- Date与Calendar
- Hadoop-2.2.0中文文档—— Common - CLI MiniCluster
- if简单的写法之范围
- (转)java反射机制及简单工厂模式
- man ctags
- Dynamics CRM 2015Online Update1 new feature之 通过业务规则清空字段的值
- 用JavaScript比较两个数组是否相等
- 3阶马尔可夫链 自然语言处理python
- Java并发编程笔记之ReentrantLock源码分析
- linux每日命令(18):whereis命令
- 在Eclipse上安装Activiti插件
- 记一次给nginx的web服务器目录加软链接
- javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.Size' validating type 'java.util.Date'.
- web中的水晶报表 ";出现通信错误。将停止打印";
- WlanGetAvailableNetworkList
- TensorFlow基础笔记(6) 图像风格化实验
- E-R图到数据库表
热门文章
- CSV文件转EXCEl(java)
- [转] Redis在windows下安装过程
- fragment间的数据传递
- 联想 K5 Pro(L38041)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 5.0.188
- 3星|《未来公司》:Uber简史
- 【sqli-labs】【jsp/tomcat】 less29 less30 less31 less32 (GET型利用HTTP参数污染的注入)
- 设置CAD显示窗体
- 少啰嗦!一分钟带你读懂Java的NIO和经典IO的区别
- Leetcode747至少是其他数字两倍的最大数
- 继 S-HR之代码创建临时表并插入数据 完整功能之员工职业信息变更报表