首页 编程技术Shell脚本实现Linux回收站功能

Shell脚本实现Linux回收站功能

运维派隶属马哥教育旗下专业运维社区,是国内成立最早的IT运维技术社区,欢迎关注公众号:yunweipai
领取学习更多免费Linux云计算、Python、Docker、K8s教程关注公众号:马哥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 : ‘{print1,"FileName:"2, "Time:"4}’)
linecount=(catmvlog | 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 : ‘{print1}’)
filename=(sed -n "answer""p" mvlog | awk -F : ‘{print2}’)
filerand=(sed -n "answer""p" mvlog | awk -F : ‘{print3}’)
fullname=addressfilename
if [ -e "fullname" ]
then
echo "The file exist!"
sleep 1
else
old="
garbage/filename:filerand"
new="addressfilename"
mv "old" "new"
delline=( catmvlog | sed "answer""d" | sort -omvlog)
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]

本文链接:http://www.yunweipai.com/1579.html

网友评论comments

发表评论

电子邮件地址不会被公开。

  1. Simon说道:

    这种方法与回收站不是完全等价。回收站有压缩功能的,并不是原封不动的复制。

Copyright © 2012-2020 YUNWEIPAI.COM - 运维派
扫二维码
扫二维码
返回顶部