Board logo

标题: 回收站功能在 Linux 中的实现-1 [打印本页]

作者: look_w    时间: 2017-12-19 20:46     标题: 回收站功能在 Linux 中的实现-1

概述删除是危险系数很高的操作,一旦误删可能会造成难以估计的损失。在 Linux 系统中这种危险尤为明显,一条简单的语句:rm –rf /* 就会把整个系统全部删除,而 Linux    并不会因为这条语句的不合理而拒绝执行。 在 Windows    中,为了防止误删,系统提供了回收站功能。用户在执行删除操作后,文件并不会直接从硬盘中删除,而是被放到回收站中。在清空回收站前,如果发现有文件被误删,用户可以将回收站中的文件恢复到原来的位置。而    Linux 并没有提供类似功能,删除命令 rm 一旦确认执行,文件就会直接从系统中删除,很难恢复。
回收站构成本文共用三个脚本实现了回收站的主要功能:Delete 脚本、logTrashDir 脚本和 restoreTrash 脚本。其中 Delete    脚本是核心脚本,其作用是重新封装 rm 命令。相对于 rm 的直接删除,该命令会先将文件或目录移动到$home/trash 目录下。如果用户想要将文件直接删除,可以用 -f 选项,delete 脚本会直接调用 rm –f 命令将文件从硬盘上删除。logTrashDir 脚本用于将被删除文件的信息记录到 trash 目录下的一个隐藏文件中。restoreTrash 脚本用来将放入 trash 中的文件或目录重新恢复到原路径下。在 Linux 系统中,只要将这三个脚本放到/bin/目录下,并用 chmod +X filename 赋予可执行权限,即可直接使用。下面将介绍每个脚本的主要部分
Delete 脚本创建目录首先要创建目录来存放被删除的文件,本文在用户根目录$HOME 下建立 trash 目录来存放文件。具体代码如下:
清单 1.创建回收站目录
1
2
3
4
5
6
realrm="/bin/rm"
if [ ! -d ~/trash ]
then
      mkdir -v ~/trash
      chmod 777 ~/trash
fi




如上所示,先判断目录是否已建立,如未建立,即第一次运行该脚本,则创建 trash 目录。变量 realrm 存放了 Linux 的 rm 脚本位置,用于在特定条件下调用以直接删除文件或目录。
输出帮助信息该脚本在用户仅输入脚本名而未输入参数执行时,输出简要帮助信息,代码如下:
清单 2.输出帮助信息
1
2
3
4
if [ $# -eq 0 ]
  then
      echo "Usage:delete file1 [file2 file3....]"
      echo "If the options contain -f,then the script will exec 'rm' directly"




如代码所示,该脚本的运用格式是 delete 后跟要删除的文件或目录的路径,中间用空格隔开。
直接删除文件有些用户确认失效并想直接删除的文件,不应放入回收站中,而应直接从硬盘中删除。Delete 脚本提供了-f 选项来执行这项操作:
清单 3.直接删除文件
1
2
3
4
5
6
7
8
9
10
11
12
while getopts "dfiPRrvW" opt
      do
        case $opt in
            f)
               exec $realrm "$@"
                ;;
            *)
               
               # do nothing     
                ;;
        esac
      done




如果用户在命令中加入了-f 选项,则 delete 脚本会直接调用 rm 命令将文件或目录直接删除。如代码中所示,所有的参数包括选项都会传递给 rm 命令。所以只要选项中包括选项-f 就等于调用 rm 命令,可以使用 rm 的所有功能。如:delete –rfv filename 等于 rm –rfv filename。
用户交互需要与用户确认是否将文件放入回收站。相当于 Windows 的弹窗提示,防止用户误操作。
清单 4.用户交互
1
2
3
4
echo -ne "Are you sure you want to move the files to the trash?[Y/N]:\a"
read reply
if [ $reply = "y" -o $reply = "Y" ]
  then #####




判断文件类型并直接删除大于 2G 文件本脚本只对普通文件和目录做操作,其他类型文件不做处理。先对每个参数做循环,判断他们的类型,对于符合的类型再判断他们的大小是否超过 2G,如果是则直接从系统中删除,避免回收站占用太大的硬盘空间。
清单 5.删除大于 2G 的文件
1
2
3
4
5
6
7
8
9
10
11
12
for file in $@
do
if [ -f "$file" –o –d "$file" ]
then
if [ -f "$file" ] && [ `ls –l $file|awk '{print $5}'` -gt 2147483648 ]
   then
      echo "$file size is larger than 2G,will be deleted directly"
        `rm –rf $file`
elif [ -d "$file" ] && [ `du –sb $file|awk '{print $1}'` -gt 2147483648 ]
   then
      echo "The directoryfile is larger than 2G,will be deleted directly"
        `rm –rf $file`




如以上代码所示,该脚本用不同的命令分别判断目录和文件的大小。鉴于目录的大小应该是包含其中的文件以及子目录的总大小,所以运用了'du -sb'命令。两种情况都使用了 awk 来获取特定输出字段的值来作比较。
移动文件到回收站并做记录该部分是 Delete 脚本的主要部分,主要完成以下几个功能





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0