1. 程式人生 > >Shell指令碼實現Linux回收站功能

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:[email protected]

"
}

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]