为 CentOS 添加回收站功能

在 centos 中删除文件时会使用 rm -rf 命令,然而该命令往往造成不可挽回的后果,比如手抖删错目录然后过段时间再想恢复几乎时不可能的。在很多桌面发行版本中已经有了回收站功能,在服务器端的 centos 中这个功能更为重要。

接下来就是一个经典的添加“回收站功能”的教程。

编写 Shell 脚本

教程原理即是使用 bash 脚本中 alias 命令重写 rm 命令,将其修改为移动到指定回收站目录。

脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
mkdir -p ~/.trash
alias rm=trash
alias r=trash
alias rl='ls ~/.trash'
alias ur=undelfile
undelfile() {
mv -i ~/.trash/$@ ./
}
trash() {
mv $@ ~/.trash/
}

脚本很简单,即使没有任何 bash 编程基础也看得出大概意思。

首先在用户根目录下新建隐藏目录 .trash 作为回收站目录。然后重写 rm 命令。其中 $@ 为获取输入的所有参数。所以重写命令后不需要使用 -r 参数,因为 mv 命令没有该参数。

应用脚本

将上面的脚本追加到 /etc/profile 尾部,使用 source /etc/profile 应用改变,则所有的用户都会应用改变(第一次切换用户时记得 source /etc/profile)。如果想仅对某用户添加回收站功能,则修改用户目录下的 .bashrc 文件,追加上面的脚本,然后 source ~/.bashrc 即可。

进阶版回收站

下面的回收站会根据删除时间分类并自动清理回收站。转载至《CentOS实现回收站机制》

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/bin/bash
month=`date "+%m"` #获取当前月份
day=`date "+%d"` #获取当前日期 

last_day=`date -d "-1 day" "+%d"` #获取前天月份
last_day_m=`date -d "-1 day" "+%m"` #获取前天日期

del_day=`date -d "-5 day" "+%d"` #获取五天前月份
del_day_m=`date -d "-5 day" "+%m"` #获取五天前日期

Trash_dir="/tmp/del_bak" #回收站总目录
tmp_dir="/tmp/del_bak/tmp" #每天删除文件存放目录

#下面是创建相应目录,并赋予777权限15
if [ ! -d $Trash_dir ]
then
/bin/mkdir -p $Trash_dir
/bin/chmod 777 $Trash_dir
fi

if [ ! -d $tmp_dir ]
then
/bin/mkdir -p $tmp_dir
/bin/chmod 777 $tmp_dir
fi

if [ ! -d /tmp/del_bak/$month ]
then
/bin/mkdir /tmp/del_bak/$month
/bin/chmod 777 /tmp/del_bak/$month
fi

if [ ! -d /tmp/del_bak/$month/$day ]
then
/bin/mkdir /tmp/del_bak/$month/$day
/bin/chmod 777 /tmp/del_bak/$month/$day
fi

Trash_file=`/bin/ls -A $tmp_dir`

#这是定时在每天凌晨将昨天删除的文件放到已月份和日期分类的目录下
#保证/tmp/del_bak/tmp目录下只存放当天删除的文件
if [ "$Trash_file" != "" ]
then
cd $tmp_dir
if [ ! -d /tmp/del_bak/$last_day_m/$last_day/ ]
then
/bin/mkdir -p /tmp/del_bak/$last_day_m/$last_day/
fi
/bin/mv $tmp_dir/* /tmp/del_bak/$last_day_m/$last_day/
fi

if [ -d $Trash_dir/$del_day_m/$del_day/ ] #清理五天前删除的文件
then
cd $Trash_dir/$del_day_m/$del_day/ && {
/bin/rm -rf $Trash_dir/$del_day_m/$del_day/
}
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
USER=`/usr/bin/whoami` #获取当前用户
TOOLS="/usr/local/tools" #存放Trash_mkdir.sh定时任务脚本的路径,可根据个人自行修改
HOME_DIR=`/bin/grep "$USER" /etc/passwd|awk -F ":" '{print $6}'` #获取当前用户家目录
CONF=$HOME_DIR"/.bashrc" #拼接当前用户的配置文件路径
Trash=`/bin/grep "del" $CONF` #判断是否已经配置了回收站机制

if [ "$Trash" = "" ] #添加回收站别名del
then
echo "alias del='mv -t /tmp/del_bak/tmp/ --backup=t'" >>$CONF
fi

if [ ! -d $TOOLS ]
then
/bin/mkdir -p $TOOLS
fi

/bin/cp Trash_mkdir.sh $TOOLS #拷贝定时任务脚本到指定目录
/bin/chmod +x $TOOLS/Trash_mkdir.sh

if [ -z "`grep 'Trash_mkdir.sh' /var/spool/cron/root`" ] #判断定时任务crontab里是否已经加了回收站脚本
then
echo "10 0 * * * $TOOLS/Trash_mkdir.sh" >>/var/spool/cron/root
fi

/bin/sh $TOOLS/Trash_mkdir.sh 

部署说明

  1. 将两个脚本放在同一目录下

  2. 使用需要启用回收站功能的用户去执行install_Trash.sh脚本即可一键安装