欢迎您光临本站,如有问题请及时联系我们。

Shell脚本实现Linux回收站功能

在系统运维过程中“Linux系统上常见的误操作”之首就是删除rm操作(特别是rm -rf),这些被误删的文件将无法被取回,那么是否有办法解决这个问题呢?目前有两种解决方案:

1. 第一种是如果你在误删除文件以后,若没有对硬盘做大量的IO(也就是硬盘上存放该被删除文件的设备块没被新的数据所覆盖),那么可借助一些第三方软件支持从硬盘上直接还原文件,在Linux有这方面的第三方软件,类似windows平台下的FinalData。

2. 第二种则是在你每次删除文件时,都将被删除的文件复制一份到指定的目录下,在你发现误删文件后能够从该目录下取回数据,这就相当于windows下的回收站了。

这篇文章将介绍的则是第二种解决方案,其优缺点都是非常明显的,优点是:可以确保每次删除的文件都能够找回;缺点就是:需要耗费相当一部分硬盘空间来存放被删除的文件;同时需要在每次删除文件时都必须通过这个删除脚本来处理。

下面看看这个Linux Shell脚本,既然其优缺点都非常明显,但这妨碍我们学习这种解决问题的思路……

[code lang=”shell”]
#!/bin/bash
from1=$1
from2=$2
garbage=$HOME/.garbage
mvlog=$garbage/mv.log
if [ ! -e $garbage ]
then
   mkdir -p $garbage
   chmod 777 $garbage
fi
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> $mvlog
  mv "$from1"  "$garbage/$from1:$random"
fi
}
function more
{
for file in *
do
echo "`pwd`/:$file:$random:`date`" >> $mvlog
mv $file "$garbage/$file:$random"
done 2> /dev/null
}
function rmi
{
if [ ! -d "$from2" ]
then
  echo -n "rm:remove regular empty file ‘$from2’?" ; read answer;
   if [ "$answer" = ‘y’ -o "$answer" = ‘Y’ ]
    then
       echo "`pwd`/:$from2:$random:`date`" >> $mvlog
        mv "$from2" "$garbage/$from2:$random"
   fi
else
  echo "rm: cannot remove directory ‘$from2’: Is a directory"
fi

}
function rmf
{
if [ ! -d "$from2" ]
then
       echo "`pwd`/:$from2:$random:`date`" >> $mvlog
        mv "$from2" "$garbage/$from2:$random"
else
  echo "rm: cannot remove directory ‘$from2’: Is a directory"
fi
}
function rmr
{
if [ -e "$from2" ]
then
       result=$(echo $from2 | sed ‘s/////g’)
       echo "`pwd`/:$result:$random:`date`" >> $mvlog
        mv "$result" "$garbage/$result:$random"
fi

}
function rml
{
while :
do
clear
line=$(cat -n $mvlog | awk -F : ‘{print $1,"FileName:"$2,    "Time:"$4}’)
linecount=$(cat $mvlog | wc -l)
echo -e "$line/c"
echo
echo
echo "Please input number you want revent(line count:$linecount)–exit(e)"
read answer
if [ "$answer" = e -o "$answer" = E ]
 then
   break
else
   (
    echo "please input y(sure:)"
      read answer1
      if [ "$answer1" = y -o "$answer" = 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 1
          else
              old="$garbage/$filename:$filerand"
              new="$address$filename"
              mv "$old" "$new"
              delline=$( cat $mvlog | sed "$answer""d" | sort -o $mvlog)
              echo "update ok!!!"
              sleep 1
          fi
      fi
   )
 fi
done

}
function help
{
echo "
-i)  If you wants delete some file , this function is confirm you want,the same as old rm.
-f)  If you wants delete some directory ,you can use this function ,the same as old rm.
-r)  If you wants delete some directory of file ,this function can use , the same as old rm.
-l)  This is new function,is you wants resume some file or directory you can use this function,
    first this function can list some file in you garbage , these have some number ,if you
    wants resume 1,you can input 1 and then input y to confirm.
If you want add some function or some new idear please contact me…
    author:wds
     email:7717060@sina.com

"
}

case "$1"
 in
[a-z]) : ;;
[0-9]) : ;;
[A-Z]) : ;;
   ?) more ;;
   *) :;;
esac
if [ "$#" -eq 0 ]
then
  echo -n "rm: missing operand
Try ‘rm –help’ for more informaction.
"
fi
if [ "$#" -eq 1 ]
then
  case "$from1"
     in
      -i) echo "Try ‘rm –help’ for more informaction."; break ;;
      -f) echo "Try ‘rm –help’ for more informaction."; break ;;
      -r) echo "Try ‘rm –help’ for more informaction."; break ;;

-l) rml ;;
  –help) help;;
       *) rm1;;
  esac
fi

if [ "$#" -eq 2 ]
then
   case "$from1"
     in
      -i) rmi ;;
      -f) rmf ;;
      -r) rmr ;;
      -l) rml ;;
     -rf) rmr ;;
  –help) help ;;
   esac
fi

if [ "$#" -gt 2 ]
        then
          for file in $*
            do
              mv $file "$home/"
          done 2> /dev/null
       fi
[/code]

来源:本文由E8运维原创撰写,欢迎分享本文,转载请保留出处和链接!