“rm -rf /
”并不只是一个传说,手一抖全没了!_! 那么防误删都有哪些方法?在《IC设计中常用的Linux命令》中提到:
set rmstar
set noclobber
rm -i, mv -i, cp -i操作确认
编辑器的自动定时备份
用版本管理工具管理源代码
用mv代替rm
异地备份
其中,版本管理(通常用来管理项目源代码)是备份项目文件最好的方法。当然,版本管理还要push到远程(另一台电脑)才有用。不然整个目录一删还是全没了。
异地备份是指通过ftp、rsync、cp等方式同步到另一台电脑,效果不错,但需要定期手动操作。能不能恢复取决于上一次备份是什么时候。
今天要说的一种方法就是用mv代替rm。没有了rm命令就删不掉了吧。需要删除时,直接用mv剪切到回收站。但mv的参数与rm有些不同,并且rm敲习惯了怎么办?那就写个脚本来兼容rm吧。
需求
兼容所有rm的参数,并转换成mv的参数
回收站里按系统时间建目录,方便恢复和清理
特殊文件(仿真临时文件等)不进回收站
实现
特殊文件不进回收站,有两种方式。一是在脚本或makefile里写成/bin/rm xxx
,用全路径直接调用系统的rm(避开我们现在写的这个防误删脚本)。二是,rm加--force
参数,这么长的参数不太可能是手抖能抖出来的。
下面是全部代码,主要功能都加了代码注释:
import os
import sys
import shutil
import getpass
import re
import time
import datetime
Ver = "1.8"
MyFileList = []
MyIgnoreList = []
user = getpass.getuser()
date_time_dir = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time()))
for arg in sys.argv[1:]:
if arg == '-h' or arg == '-help' or arg == '--help':
print("rm2mv v" + Ver)
print("a script to replace system rm, moves dirs or files to ~/.Trash instead of deleting them directly.")
print("e.g. rm2mv xx.v delete a file")
print(" rm2mv -rf rtl delete a directory")
print(" rm2mv --force simv* delete file or dir not going to ~/.Trash")
print(" rm2mv --clean clean files 1 week before from ~/.Trash")
sys.exit()
elif arg == '--version':
print('rm2mv v' + Ver)
sys.exit()
elif arg == '--force':
os.system('/bin/rm -rf ' + ' '.join(sys.argv[1:]))
elif re.search(r'/\.Trash/', arg):
os.system('/bin/rm -rf ' + ' '.join(sys.argv[1:]))
elif arg == '--clean':
dirs = os.listdir('/home/{}/.Trash'.format(user))
for dt in dirs:
if((datetime.datetime.now() - datetime.datetime(int(dt[0:4]), int(dt[4:6]), int(dt[6:8]))).days > 7):
shutil.rmtree(dt)
sys.exit()
elif not arg.startswith('-'):
if arg == '/' or \
arg == '~' or \
re.match(r'/home/\w+/?$', arg) or \
re.match(r'/\w+/?$', arg):
print("[Warning] deleting dangerous files: " + arg)
sys.exit()
else:
if os.path.exists(arg):
MyFileList.append(arg)
else:
MyIgnoreList.append(arg)
else:
MyIgnoreList.append(arg)
if len(MyFileList) != 0:
target = '/home/{}/.Trash/{}'.format(user, date_time_dir)
if not os.path.exists(target):
os.makedirs(target)
os.system('mv {} {}/'.format(' '.join(MyFileList), target))
使用方法
代替rm并不是要真的删除/bin/rm,只需要放到/home/xxx/bin/下,并把/home/xxx/bin加到环境变量$PATH前。
mkdir /home/xxx/bin
cd /home/xxx/bin
cp rm2mv.py .
ln -s rm2mv.py rm
最后,用which rm
确认下。
这里是一些示例:
rm xx.v 删除文件
rm -rf rtl 删除文件夹
rm --force simv* 直接删除,不进回收站
rm --clean 清除回收站中一周前的文件
警告
本脚本可能存在bug,仅供学习。商业使用之前应当仔细测试和评估,以免造成损失。