Chinaunix

标题: 在LINUX上实现 windows 回收站功能的脚本 [打印本页]

作者: lijie3721    时间: 2010-05-18 15:26
标题: 在LINUX上实现 windows 回收站功能的脚本
本帖最后由 lijie3721 于 2010-09-08 18:51 编辑

rm_v1.4.tgz.pdf (1.64 KB, 下载次数: 429) 由于公司里的备份软件是每天晚上执行一次,如果员工当天不小心删除了文件,那只能回复到昨天的状态,如果是员工今天花了一天才写完的CODE,那就没法恢复 了,这样就员工一天的工作就白干了,当然你可能会说,这个员工活该,谁让他不小心了,但是当事情发生了之后,人家就会来找你解决了,虽然 你平常躲在角落里听歌、看电影网上看美女没人管,但是当真正有了问题后人家第一个想到的还是你, 这个时候你总不能跟人家你不会吧,这可是体现你技术水平的时候,呵呵,你是这些stupid 的技术人员的最后救命稻草呀……,那就把文件给他恢复回来,把下面的脚本安装到你的 Linux系统上就好了,呵呵,Solaris 和AIX还有其它UNIX不知道好不好使,反正只要rm 命令用法是一样的,那就没问题!
########################################################################################
作者:李杰
发布时间: 2010-05-07
版本:1.0

脚本功能:
1.   在用户执行rm命令时,将文件移动/dump-file/ ,被 移动到dump-file 目录下的文件、文件夹以原文件名+删除除的日期格式存放,如 weather.txt 在删除后就会被自动移动到/dump-file/ 下并命名为weather.txt_2010-05-07_14:46:51.bak
2.   此命令在执行时会检测文件或目录的大小,如果文件或目录超过2GB,将不会再将文件移动到回收站,而会直接删除,此功能是为了避免回收站过大而对系统造成影响

安装需求:
1.创建删除文件存放目录mkdir /dump-file/ && chmod -R 777 /dump-file
2.创建日志输出文件 touch /tmp/rm.dump && chmod -R 777 /tmp/rm.dump
3.将系统rm命令移动成 rm.bak  : mv /bin/rm /bin/rm.bak
4.将此脚本命名为/bin/rm 并给予可执行权限 :chmod 644 /bin/rm  


#!/bin/bash
DumpFile=/dump-file/
File=`echo $line|awk '{print $2}'`
aa=$(echo $1|grep "^-")
###
function TestDir(){

Test_Dir=$(echo $line|grep "/") #test if is a directory.
Test_Dir2=$(echo $line |awk '{print $2}'|grep "^/") # Test if the prameter starts with "/".
Dir2=$(echo $line |awk -F/ '{print $2}') #Extract the prameter after the first "/".
Dir=$(echo $line |awk '{print $2}'|awk -F/ '{print $1}') ##Extract the prameter before the first "/".
D1=`date +%F_%H:%M:%S.bak`
Date=`echo $line | awk '{print $2 "_" D1}' D1=$D1`

        if [[ $Test_Dir != "" ]] ;then #If parameters include directory
                if [[ $Test_Dir2 != "" ]] ;then #If parameter starts with "/",as formate /a/b/c/
                        echo $line "start with /"
                        mkdir $DumpFile$Dir2"_"$D1 2>/tmp/rm.dump # Create directory as format /dump-file/(first directory after "/")
                       
                        mv `echo $line|awk '{print $2}'` $DumpFile$Dir2"_"$D1
                        echo $DumpFile$Dir2"_"$D1
                else #Means that parameter starts without "/" ,as format a/b/c
                        mkdir $DumpFile$Dir$D1 #Create directory as format /dump-file/(first directory before "/")
                        mv `echo $line|awk '{print $2}'` $DumpFile$Dir$D1
                        echo $line "starts before /"
                fi
        else
                Date=`echo $line | awk '{print $2 "_" D1}' D1=$D1`
                mv `echo $line|awk '{print $2}'` $DumpFile$Date
        fi

}
###
###
if [[ "$1" != "" ]] ;then #If the frist parameter is not empty.

        if [[ $aa != "$1" ]];then #If the first parameter not start with "-".
                du -s "$@" 2>/tmp/rm.dump |while read line
                do
                        #TestDir
                        size=`echo $line | awk '$1 >2000000{print $1}'`
                        if [ "$size" > "1900000" ];then
                                echo "Lager than 2Mb"
                        else
                                TestDir
                        fi
                done

        else
                if [[ "$2" != ""  ]]; then
                       until [ "$2" == ""  ]
                       do
                                 #echo "function is running"
                                 du -s $2 2> /tmp/rm.dump |while read line
                                 do
                                        size=`echo $line | awk '$1 >2000000{print $1}'`
                                        if [ "$size" > "1900000" ];then
                                                echo "Lager than 2Mb"
                                                rm.bak -rf $2
                                        else
                                                TestDir

                                        fi
                                        shift
                                 done
                                 shift
                        done
                else
                        echo -e "No file detected.\nTry 'rm --help' for more information. "
                fi
        fi
else
        echo -e "rm: missing operand \nTry 'rm --help' for more information."
fi
作者: lijie3721    时间: 2010-05-18 15:27
修订版本:
BUG现象:在安装了LINUX下的回收站后发现无法使用less命令,原因是less  会调用rm将less产生的在/tmp下临时文件删除,
解决方法:
加了一层判断,不对/tmp下的文件执行备份操作,而是直接删除
安装方法:
cp -rp /bin/rm /bin/rm.bak  #将系统原有rm 命令改成rm.bak,记住 一定要改成rm.bak,因为回收站脚本需要调用 rm.bak这个命令。
cp -rp rm.sh /bin/rm #将你的脚本文件rm.sh 覆盖成/bin/rm文件
echo "0 8  * * 6   /bin/sh  /fmnp/soft/clean-dump.sh " >>/var/spool/cron/tabs/root # 为了防止 /dump-file目录过大,采取每周进行一次删除操作,脚本如下:
    #!/bin/bash

    /bin/rm.bak -rf /dump-file/*
    /bin/rm.bak -rf /tmp/*.rm-dump
#########################################

mkdir /dump-file  &&chmod -R 777 /dump-file # 创建/dump-file 目录并给予所有用户可写的权限 。

更新后脚本:

#!/bin/bash
DumpFile=/dump-file/
File=`echo $line|awk '{print $2}'`
aa=$(echo $1|grep "^-")
DumpLog="`whoami`-`date +%m-%d-%H-%M`.rm-dump"

###

function TestDir(){

Test_Dir=$(echo $line|grep "/") #test if is a directory.
Test_Dir2=$(echo $line |awk '{print $2}'|grep "^/") # Test if the prameter starts with "/".
Test_Dir3=$(echo $line |awk '{print $2}'|grep "^/tmp") #
Dir2=$(echo $line |awk -F/ '{print $2}') #Extract the prameter after the first "/".
Dir=$(echo $line |awk '{print $2}'|awk -F/ '{print $1}') ##Extract the prameter before the first "/".
D1=`date +%F_%H:%M:%S.bak`
Date=`echo $line | awk '{print $2 "_" D1}' D1=$D1`
DumpLog="`whoami`-`date +%m-%d-%H-%M`.rm-dump"

        if [[ $Test_Dir != "" ]] ;then #If parameters include directory
                if [[ $Test_Dir2 != "" ]] ;then #If parameter starts with "/",as formate /a/b/c/
                   if [[ $Test_Dir3 != "" ]];then # this test is for to repaire less command's error.
                        rm.bak -rf `echo $line|awk '{print $2}'`
                   else
                        #echo $line "start with /"
                        mkdir $DumpFile$Dir2"_"$D1 2>/tmp/$DumpLog # Create directory as format /dump-file/(first directory after "/")
                        
                        mv `echo $line|awk '{print $2}'` $DumpFile$Dir2"_"$D1
                        echo $DumpFile$Dir2"_"$D1
                   fi
                else #Means that parameter starts without "/" ,as format a/b/c
                        mkdir $DumpFile$Dir$D1 #Create directory as format /dump-file/(first directory before "/")
                        mv `echo $line|awk '{print $2}'` $DumpFile$Dir$D1
                        echo $line "starts before /"
                fi
        else
                Date=`echo $line | awk '{print $2 "_" D1}' D1=$D1`
                mv `echo $line|awk '{print $2}'` $DumpFile$Date
        fi

}
###
###
if [[ "$1" != "" ]] ;then #If the frist parameter is not empty.

        if [[ $aa != "$1" ]];then #If the first parameter not start with "-".
                du -s "$@" 2>/tmp/$DumpLog |while read line
                do
                        size=`echo $line | awk '$1 >2000000{print $1}'`
                        if [ "$size" > "1900000" ];then
                                #echo "Lager than 2Mb"
                                rm.bak -rf `echo $line|awk '{print $2}'`
                        else
                                TestDir
                        fi
                done

        else
                if [[ "$2" != ""  ]]; then
                       until [ "$2" == ""  ]
                       do
                                 #echo "function is running"
                                 du -s $2 2> /tmp/$DumpLog |while read line
                                 do
                                        size=`echo $line | awk '$1 >2000000{print $1}'`
                                        if [ "$size" > "1900000" ];then
                                                #echo "Lager than 2Mb"
                                                rm.bak -rf $2
                                        else
                                                TestDir

                                        fi
                                        shift
                                 done
                                 shift
                        done
                else
                        echo -e "No file detected.\nTry 'rm --help' for more information. "
                fi
        fi
else
        echo -e "rm: missing operand \nTry 'rm --help' for more information."
fi
作者: lijie3721    时间: 2010-09-08 18:53
直接下载附件,然后解压执行install.sh就可以将此程序自动 安装了。
作者: gswen    时间: 2010-09-09 22:46
提示: 作者被禁止或删除 内容自动屏蔽
作者: alex3714    时间: 2010-12-30 09:39
这句话是判断如果 文件大小($1)超过2G的话就打印出来,然后在后面的判断中就不保存超过2G的数据了
作者: taojie2000    时间: 2010-12-30 10:08
哇塞  脚本一点注释名没有!
作者: alex3714    时间: 2010-12-30 10:39
主要是自己用,没加注释,抱歉
作者: laowu2517    时间: 2011-03-30 23:21
这个可以用一下,回收站还是比较不错的,哈哈哈哈
作者: gnufree    时间: 2011-04-12 17:34
厉害
作者: dooza    时间: 2011-04-12 19:25
不敢用,自己写的可以
作者: jiannma    时间: 2011-04-12 21:18
回复 1# lijie3721


    为何不使用系统自带的~/.Trash 目录?
作者: alex3714    时间: 2011-04-13 20:14
回复 10# dooza


    这个工具经过在我公司开发环境中的长期测试 ,数百位开发人员都用这个,前期的BUG多数已经修复了,你可以试着用一下。。。。
作者: 南极雨    时间: 2011-04-14 17:55
回复 1# lijie3721


    #!/bin/bash
DumpFile=/dump-file/
File=`echo $line|awk '{print $2}'`



$line是什么意思呢?
作者: alex3714    时间: 2011-04-15 13:47
回复 13# 南极雨


    是在while循环中读到的每行, cat a.txt|while read line
                                              do
                                                    echo $line
                                               done
作者: 南极雨    时间: 2011-04-15 13:50
回复 14# alex3714

脚本一开头就这样定义  ,  并没有read line 这个操作,
也可以吗?
作者: alex3714    时间: 2011-04-15 13:56
回复 15# 南极雨


    可以,我只是懒的在每个循环中再定义一次,这有点全 局变量的意思 ……
作者: SpringfieldKing    时间: 2011-04-15 15:26
唉,,怎么换了个小号发贴。。。
作者: ge_yong_linux    时间: 2011-04-15 19:21
呵呵,不错
作者: ddfgjs    时间: 2011-04-15 22:00
{:3_194:}鸡肋
作者: alex3714    时间: 2011-04-16 21:35
回复 19# ddfgjs


    此话怎讲?
作者: linuxflj    时间: 2011-04-19 11:22
呵呵!!!
作者: linuxflj    时间: 2011-04-19 11:23
请问版主用的是多少版本的啊
作者: alex3714    时间: 2011-04-20 21:09
请问版主用的是多少版本的啊
linuxflj 发表于 2011-04-19 11:23



    1.4
作者: 5iwww    时间: 2011-04-25 14:17
我觉得是这样,如果真想删除的话,是为了省出空间来。  如果只是mv一下的话。。。。解决不了空间的问题
作者: alex3714    时间: 2011-04-26 09:29
我觉得是这样,如果真想删除的话,是为了省出空间来。  如果只是mv一下的话。。。。解决不了空间的问题 :mr ...
5iwww 发表于 2011-04-25 14:17



    此脚本是为了防止误删除,不是省空间……
作者: shplpy    时间: 2011-05-06 15:27
由于公司里的备份软件是每天晚上执行一次,如果员工当天不小心删除了文件,那只能回复到昨天的状态,如果是 ...
lijie3721 发表于 2010-05-18 15:26



    bug多了点。。。
作者: alex3714    时间: 2011-05-06 18:27
bug多了点。。。
shplpy 发表于 2011-05-06 15:27



    请提出,你用的可能是老版本
作者: shplpy    时间: 2011-05-06 18:52
请提出,你用的可能是老版本
alex3714 发表于 2011-05-06 18:27



    就是一楼的附件啊,难道还有新的
作者: a774050174    时间: 2011-05-13 14:37
{:2_166:}{:2_167:}{:2_168:}{:2_169:}{:2_170:}{:2_171:}{:2_172:}{:2_173:}{:2_181:}{:2_180:}{:2_179:}{:2_178:}{:2_177:}{:2_176:}{:2_175:}{:2_174:}
作者: dengbao2001    时间: 2011-11-04 11:06
强!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2