ExASIC
分享让工作更轻松

防误删终极解决方案:用mv代替rm,实现回收站

rm -rf /”并不只是一个传说,手一抖全没了!_! 那么防误删都有哪些方法?在《IC设计中常用的Linux命令》中提到:

其中,版本管理(通常用来管理项目源代码)是备份项目文件最好的方法。当然,版本管理还要push到远程(另一台电脑)才有用。不然整个目录一删还是全没了。

异地备份是指通过ftp、rsync、cp等方式同步到另一台电脑,效果不错,但需要定期手动操作。能不能恢复取决于上一次备份是什么时候。

今天要说的一种方法就是用mv代替rm。没有了rm命令就删不掉了吧。需要删除时,直接用mv剪切到回收站。但mv的参数与rm有些不同,并且rm敲习惯了怎么办?那就写个脚本来兼容rm吧。

需求

实现

特殊文件不进回收站,有两种方式。一是在脚本或makefile里写成/bin/rm xxx,用全路径直接调用系统的rm(避开我们现在写的这个防误删脚本)。二是,rm加--force参数,这么长的参数不太可能是手抖能抖出来的。

下面是全部代码,主要功能都加了代码注释:

import os
import sys
import shutil  #rmtree
import getpass #get current user name
import re
import time
import datetime

Ver = "1.8"

MyFileList = []   # files to be deleted
MyIgnoreList = [] # ignored files, for debug

# get current login user name
user = getpass.getuser()

# for dir name in Trash
date_time_dir = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time()))

# handle rm options
for arg in sys.argv[1:]:

    # display help info. and version
    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()

    # delete directly if use option --force
    elif arg == '--force':
        os.system('/bin/rm -rf ' + ' '.join(sys.argv[1:]))

    # don't remove to trash again when you are deleting files in .Trash
    elif re.search(r'/\.Trash/', arg):
        os.system('/bin/rm -rf ' + ' '.join(sys.argv[1:]))

    # clean .Trash files one week ago
    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()

    # save filelist to list
    elif not arg.startswith('-'):
        # protect /xxx and /home/xxx
        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:
            # check if file exists to avoid mv warning, such as 'file not exist'
            if os.path.exists(arg):
                MyFileList.append(arg)
            else:
                MyIgnoreList.append(arg)
    else:
        MyIgnoreList.append(arg)

# this is the real action, create dir and move files to trash
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,仅供学习。商业使用之前应当仔细测试和评估,以免造成损失。

本脚本会不定期完善和修改bug,请到https://github.com/chenfengrugao/rm2mv查看rm2mv的最新版。

阅读数:
更多文章:文章目录
解惑专区
(支持markdown插入源代码)
欢迎使用ExASIC订阅服务
仅用于ExASIC最新文章通知,方便及时阅读。
友情链接: IC技术圈问答ReCclayCrazyFPGA