在Linux/Unix上实现 windows 回收站功能的脚本V1.3!

sh/bash/dash/ksh/zsh等Shell脚本
回复
alex3714
帖子: 6
注册时间: 2011-04-13 20:43

在Linux/Unix上实现 windows 回收站功能的脚本V1.3!

#1

帖子 alex3714 » 2011-04-13 21:10

由于公司里的备份软件是每天晚上执行一次,如果员工当天不小心删除了文件,那只能回复到昨天的状态,如果是员工今天花了一天才写完的CODE,那就没法恢复 了,这样就员工一天的工作就白干了,当然你可能会说,这个员工活该,谁让他不小心了,但是当事情发生了之后,人家就会来找你解决了,虽然 你平常躲在角落里听歌、看电影网上看美女没人管,但是当真正有了问题后人家第一个想到的还是你, 这个时候你总不能跟人家你不会吧,这可是体现你技术水平的时候,呵呵,你是这些stupid 的技术人员的最后救命稻草呀……,那就把文件给他恢复回来,把下面的脚本安装到你的 Linux系统上就好了,呵呵,Solaris 和AIX还有其它UNIX不知道好不好使,反正只要rm 命令用法是一样的,那就没问题!
########################################################################################
作者:李杰
QQ:317828332
发布时间: 2011-04-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 "^-")
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 2>/tmp/$DumpLog #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 -gt 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 -gt 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
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 在Linux/Unix上实现 windows 回收站功能的脚本V1.3!

#2

帖子 eexpress » 2011-04-13 21:14

不是有现成的libtrash
● 鸣学
头像
xzap
帖子: 256
注册时间: 2006-08-24 21:25

Re: 在Linux/Unix上实现 windows 回收站功能的脚本V1.3!

#3

帖子 xzap » 2011-04-13 23:21

这个需要这么复杂么?不就是不rm换成mv么?
alex3714
帖子: 6
注册时间: 2011-04-13 20:43

Re: 在Linux/Unix上实现 windows 回收站功能的脚本V1.3!

#4

帖子 alex3714 » 2011-04-14 9:48

不仅仅要把RM改成MV,还要模拟rm选项。。。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 在Linux/Unix上实现 windows 回收站功能的脚本V1.3!

#5

帖子 fnan » 2011-04-14 10:53

好奇的是那些本来要删除的文件保存到什么时候?
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
wjj361
帖子: 14
注册时间: 2010-06-02 16:20
系统: lubuntu14.04

Re: 在Linux/Unix上实现 windows 回收站功能的脚本V1.3!

#6

帖子 wjj361 » 2011-06-14 18:16

还有个trash-cli命令
单lubuntu1404+virtualbox ing,比单win好用,过度无压力
头像
流浪风雨
帖子: 228
注册时间: 2010-12-09 13:19

Re: 在Linux/Unix上实现 windows 回收站功能的脚本V1.3!

#7

帖子 流浪风雨 » 2011-06-14 20:24

奇怪UNIX类都没回收站吗?还真没注意过。。。。
---------------------------------------------
http://www.haiku-os.org/community/donating_to_haiku
开源操作系统公益捐款链接
软件仓库
https://depot.haiku-os.org/#/?bcguid=bc ... MOSTRECENT
头像
lilydjwg
论坛版主
帖子: 4258
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 在Linux/Unix上实现 windows 回收站功能的脚本V1.3!

#8

帖子 lilydjwg » 2011-06-14 21:48

流浪风雨 写了:奇怪UNIX类都没回收站吗?还真没注意过。。。。
命令行从来没有回收站,Linux 命令行没有,Windows 的也没有,DOS 也没有。Windows 图形环境有回收站,Gnome 也有,KDE 也有。
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: 在Linux/Unix上实现 windows 回收站功能的脚本V1.3!

#9

帖子 tusooa » 2011-06-16 20:39

代码: 全选

● which rm
rm () {
        local dest file i
        mkdir -p $RM_DESTDIR
        while [ $# -gt 0 ]
        do
                case "$1" in
                        (-*) shift ;;
                        (*) [ -z "$1" ] && continue
                                case "$1" in
                                        (/*) file=$1  ;;
                                        (*) file=$PWD/$1  ;;
                                esac
                                i=0 
                                dest=$((i++))-$(basename $file) 
                                while [ -f "$RM_DESTDIR/$dest" ] || [ -d "$RM_DESTDIR/$dest" ]
                                do
                                        dest=$((i++))-$(basename $file) 
                                done
                                mv "$file" "$RM_DESTDIR/$dest"
                                cat >> $HOME/.rm <<EOF
Source:$file
Dest:$dest
EOF
                                shift ;;
                esac
        done
}

代码: 全选

] ls -ld //
头像
photor
论坛版主
帖子: 11004
注册时间: 2008-04-26 12:41

Re: 在Linux/Unix上实现 windows 回收站功能的脚本V1.3!

#10

帖子 photor » 2011-06-16 22:16

lilydjwg 写了:
流浪风雨 写了:奇怪UNIX类都没回收站吗?还真没注意过。。。。
命令行从来没有回收站,Linux 命令行没有,Windows 的也没有,DOS 也没有。Windows 图形环境有回收站,Gnome 也有,KDE 也有。
:em09
回复