手机
当前位置:查字典教程网 >脚本专栏 >linuxshell >shell编程之实现windows回收站功能分享
shell编程之实现windows回收站功能分享
摘要:一.功能简介1.将删除的文件放在回收站中2.恢复删除的文件3.实现linuxrm命令的功能,使用起来几乎和linux系统自带的rm,命令完全...

一. 功能简介

1. 将删除的文件放在回收站中

2. 恢复删除的文件

3. 实现linux rm命令的功能, 使用起来几乎和linux 系统自带的rm ,命令完全一样

4. 新增功能: rm -l, rm -e, rm -c

5. 该脚本每次在运行时候会检查$HOME/.trash 目录下文件大小之和, 若

超过最大容量, 脚本会自动将日志文件中所记录文件中的前一半文件从回

收站中清除,所以建议删除大文件(相对于回收站最大容量而言)直接用

命令/bin/rm 而不要用 rm.

二. 使用方法:

1. 将trash文件放到 $HOME/bin/

2. 在$HOME/.bashrc 文件中加入alias rm=”$HOME/bin/trash”, 重新登陆终端或执行bash命令。

3. 执行命令rm -e 配置回收站的最大容量,单位K

4. 回收站的默认目录为:$HOME/.trash, 默认配置文件为:$HOME/.trash/trash.conf

默认log文件为:$HOME/.trash/trash.log

5. 怎样恢复文件:

在linux 终端中输入rm -l, 然后 在RowNumber: 后面键入要删除文件所在的行标识:988 键入y/Y 然后按回车键 恢复成功.

如果想只查看删除列表, 则键入rm -l 后直接按回车键或者键入Q/q

6. 更详细的参数介绍请键入:rm --help

三. 注意事项

1. 想要手动清空$HOME/.trash目录需要用/bin/rm命令, 请不要尝试用rm -r $HOME/.trash 的方法.

2. 该脚本不支持rm -r -f , rm -rfi (选项组合超过2个)格式.

3. 如果你可以你甚至可以用该脚本作为备份脚本, 假若想备份test2.txt你只需要执行rm test2.txt, 当然如果真想备份某个文件的话, 最好编写专门的备份脚本。

复制代码 代码如下:

#!/bin/bash

#配置回收站最大的存储空间(字节)

#maxmemory=51200 (50M)

#maxmemory=102400 (100M)

#maxmemory=512000 (500M)

#根据情况设置为50M(对于isoa服务开发来说足够了)

maxmemory=3145728

#设置回收站所在的目录

trash=$HOME/.trash

#设置日志文件所在的目录

mvlog=$trash/trash.log

from1=$1

from2=$2

var_pwd=

var_father=

#回收站若不存在,则新建之

if [ ! -e $trash ];then

mkdir -p $trash

chmod 755 $trash

fi

#产生7位的随机数

function rand()

{

a=(0 1 2 3 4 5 6 7 8 9 a b c d e A B C D E F)

for ((i=0;i<7;i++))

do

echo -n ${a[$RANDOM%${#a[*]}]}

done

}

random=$(rand)

#文件不存在时的提示信息

function file_null()

{

local file=$1

echo "rm: cannot remove '$file': No such file or directory"

}

#打印参数出错后的提示信息

function echo_msg()

{

echo -n "rm: missing operand

Try 'rm --help' for more information.

"

}

function echo_msg2()

{

echo -n "rm: invalid option '$1'

Try 'rm --help' for more information.

"

}

#回收站管理函数

function deal()

{

local tmp=$(mktemp /tmp/tfile.XXXXXX)

local num=$(($(cat $mvlog| wc -l)/2))

#awk -F: -v nu=$num -v trash=$trash '{if (NR<=nu) system("rm -rf "trash"'/'"$2"':'"$3"");

#else print $0}' $mvlog | sort -o $mvlog

awk -F: -v nu=$num -v trash=$trash '{if (NR<=nu) system("rm -rf "trash"'/'"$2"':'"$3"");

else print $0}' $mvlog >> $tmp

mv $tmp $mvlog

}

JUG=

#目录处理函数

function jug_cur()

{

local tmp=

local dirname=$1

local jug=${dirname//*/}

if [ "$jug" == "." ];then

var_pwd=${dirname/./$(pwd)}

JUG=0

elif [ "$jug" == ".." ];then

tm=$(pwd)

tmp=${tm%/*}

var_father=${dirname/../$tmp}

JUG=1

#elif [ "$jug" == "~" ];then

#return 2

else

JUG=2

fi

}

#命令不带参数时的普通文件删除函数

function rm1

{

local filename=$(basename $from1)

local dirname=$(dirname $from1)

jug_cur $dirname

if [ "$JUG" -eq 0 ];then

dirname=$var_pwd

elif [ $JUG -eq 1 ];then

dirname=$var_father

fi

if [ -d "$from1" ];then

echo "rm: cannot remove '$from1': Is a directory"

else

if [ ! -e $from1 ];then

file_null $from1

else

echo "$dirname:$filename:$random:$(date +%Y-%m-%d.%T)" >> $mvlog

mv "$from1" "$trash/$filename:$random"

fi

fi

}

#rm -i

function rmi()

{

local filename=$(basename $from2)

local dirname=$(dirname $from2)

jug_cur $dirname

if [ $JUG -eq 0 ];then

dirname=$var_pwd

elif [ $JUG -eq 1 ];then

dirname=$var_father

fi

if [ -f "$from2" ];then

echo -n "rm: remove regular file '$from2'?"

read answer

if [ "$answer" = 'y' -o "$answer" = 'Y' ];then

echo "$dirname:$filename:$random:$(date +%Y-%m-%d.%T)" >> $mvlog

mv "$from2" "$trash/$filename:$random"

fi

else

if [ ! -e $from2 ];then

file_null $from2

else

echo "rm: cannot remove '$from2': Is a directory"

fi

fi

}

#rm -f

function rmf()

{

local filename=$(basename $from2)

local dirname=$(dirname $from2)

jug_cur $dirname

if [ $JUG -eq 0 ];then

dirname=$var_pwd

elif [ $JUG -eq 1 ];then

dirname=$var_father

fi

if [ -f "$from2" ];then

echo "$dirname:$filename:$random:$(date +%Y-%m-%d.%T)" >> $mvlog

mv "$from2" "$trash/$filename:$random"

else

if [ ! -e $from2 ];then

:

else

echo "rm: cannot remove '$from2': Is a directory"

fi

fi

}

#rm -r

function rmr()

{

local filename=$(basename $from2)

local dirname=$(dirname $from2)

jug_cur $dirname

if [ $JUG -eq 0 ];then

dirname=$var_pwd

elif [ $JUG -eq 1 ];then

dirname=$var_father

fi

if [ "$from2" = "." -o "$from2" = ".." ];then

echo "rm: cannot remove directory: '$from2'"

elif [ -e "$from2" ];then

echo "$dirname:$filename:$random:$(date +%Y-%m-%d.%T)" >> $mvlog

mv "$from2" "$trash/$filename:$random"

else

file_null $from2

fi

}

#rm -rf

function rmrf()

{

local filename=$(basename $from2)

local dirname=$(dirname $from2)

jug_cur $dirname

if [ $JUG -eq 0 ];then

dirname=$var_pwd

elif [ $JUG -eq 1 ];then

dirname=$var_father

fi

if [ "$from2" = "." -o "$from2" = ".." ];then

echo "rm: cannot remove directory: '$from2'"

elif [ -e "$from2" ];then

echo "$dirname:$filename:$random:$(date +%Y-%m-%d.%T)" >> $mvlog

mv "$from2" "$trash/$filename:$random"

else

:

fi

}

#rm -ir

function rmir()

{

local filename=$(basename $from2)

local dirname=$(dirname $from2)

jug_cur $dirname

if [ $JUG -eq 0 ];then

dirname=$var_pwd

elif [ $JUG -eq 1 ];then

dirname=$var_father

fi

if [ -e "$from2" ];then

if [ -d "$from2" ];then

echo -n "rm: remove directory '$from2'?"

else

echo -n "rm: remove regular file '$from2'?"

fi

read answer

if [ "$answer" = 'y' -o "$answer" = 'Y' ];then

echo "$dirname:$filename:$random:$(date +%Y-%m-%d.%T)" >> $mvlog

mv "$from2" "$trash/$filename:$random"

fi

else

if [ ! -e $from2 ];then

file_null $from2

fi

fi

}

#清空回收站

function rmc()

{

/bin/rm -rf $trash

}

function rml()

{

local tmp=$(mktemp /tmp/tfile.XXXXXX)

clear

if [ ! -d "$trash" ];then

mkdir $trash

fi

if [ ! -f "$mvlog" ];then

touch $mvlog

fi

line=$(cat -n $mvlog | awk -F: '{print $1, "FileName:"$2, "Time: "$4":"$5":"$6}')

linecount=$(cat $mvlog | wc -l)

echo -e "$line"

echo

echo

echo "[$linecount] Please enter the file you want to restore (replaced with the line number)"

printf "RowNumber: "

read answer

if [ "$answer" = 'q' -o "$answer" = 'Q' -o "$answer" = "" ];then

:

else

printf "Please confirm (Y/N): "

read answer1

if [ "$answer1" = 'y' -o "$answer1" = 'Y' ];then

address=$(sed -n "$answer""p" $mvlog | awk -F: '{print $1}')

filename=$(sed -n "$answer""p" $mvlog | awk -F: '{print $2}')

filerand=$(sed -n "$answer""p" $mvlog | awk -F: '{print $3}')

fullname=$address/$filename

if [ -e "$fullname" ];then

echo "The file exist!"

sleep 0.5

else

old="$trash/$filename:$filerand"

new="$address/$filename"

mv "$old" "$new"

#deline=$(cat $mvlog|sed "$answer""d" | sort -o $mvlog)

deline=$(cat $mvlog|sed "$answer""d" >> $tmp)

mv $tmp $mvlog

echo "restore success!"

sleep 0.5

fi

fi

fi

}

function help()

{

cat << 'EOF'

Usage: rm [OPTION]... FILE...

Remove (unlink) the FILE(s).

-f, --force ignore nonexistent files, never prompt

-i, --interactive prompt before any removal

--no-preserve-root do not treat `/' specially (the default)

--preserve-root fail to operate recursively on `/'

-r, -R, --recursive remove directories and their contents recursively

--help display this help and exit

By default, rm does not remove directories. Use the --recursive (-r or -R)

option to remove each listed directory, too, along with all of its contents.

To remove a file whose name starts with a `-', for example `-foo',

use one of these commands:

rm -- -foo

rm ./-foo

Note that if you use rm to remove a file, it is usually possible to recover

the contents of that file. If you want more assurance that the contents are

truly unrecoverable, consider using shred.

Report bugs to <bug-coreutils@gnu.org>.

EOF

}

#脚本开始

#检测回收站已用存储空间,如果已经达到最大值,则删除日志文件中位于前面的一半的文件

mem=$(du -s $trash|awk '{print $1}')

if [ "$mem" -gt $maxmemory ];then

deal

fi

if [ "$#" -eq 0 ];then

echo_msg

fi

if [ "$#" -eq 1 ];then

case "$from1" in

-i)

echo_msg

-f)

echo_msg

-r | -R)

echo_msg

-ir|-ri|-iR|-Ri|-if|-fi|-rf|-fr|-Rf|-fR)

echo_msg

-l)

rml

-c)

rmc

--help)

help

-*)

echo_msg2 $from1

*)

rm1

esac

fi

if [ "$#" -ge 2 ];then

until [ "$2" = "" ]

do

from2=$2

case "$from1" in

-i)

rmi

-f)

rmf

-r|-R)

rmr

-l)

rml

-rf|-Rf|-fr|-fR)

rmrf

-ir|-ri|-iR|-Ri)

rmir

-if|-fi)

rmf

--help)

help

exit 1

-*)

echo_msg2 $from1

exit 1

*)

{

until [ "$1" = "" ]

do

from1=$1

rm1

shift

done

}

esac

shift

done

fi

exit

【shell编程之实现windows回收站功能分享】相关文章:

Shell脚本实现监控iptables规则是否被修改

实现shell终端代码分享(可用户登录 实现系统命令)

shell编程基础之认识与学习BASH

shell查找当前目录下大于1M的文件的三种方法分享

Linux Shell脚本编程的注意事项

Shell脚本实现ftok函数

shell脚本实现批量采集爱站关键词库

shell脚本实现文件锁功能

shell获取命令行参数示例分享

Shell脚本实现非法IP登陆自动报警

精品推荐
分类导航