一. 功能简介
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, 当然如果真想备份某个文件的话, 最好编写专门的备份脚本。
#根据情况设置为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

