rm -rf 需永遠警惕

今日在測試環(huán)境修改代碼,測試的時候,刪除舊的日志文件(方便查看當前最新生成的日志),由于多個終端的切換,導致沒有關(guān)注文件目錄,直接在src目錄下執(zhí)行rm -rf *!!!,
真是一個悲慘的教訓,上周的代碼沒有備份,也沒有提交版本庫........
警惕 :
- 要時刻保持警惕,在執(zhí)行一些無法逆轉(zhuǎn),容易產(chǎn)生不可預估的后果的命令時,一定要再三確認.
- 要隨時保持備份,保持第二方案,做好最壞的打算.
解決方案:
在總結(jié)一番后,決定寫一個類似回收站一樣的腳本來防止類似事情的發(fā)生.
- 編寫shell 腳本,使用
mv命令代替rm命令。
添加以下代碼到~/.bashrc中
alias rm='trash'
alias rl='trash_ls'
alias rr='trash_rm'
alias rg='trash_log'
alias realrm='/bin/rm'
#-------回收站
TrashHome="${HOME}/.data/"
TrashDir="${TrashHome}rubbish/"
TrashLog="${TrashHome}Log"
trash()
{
mkdir -p ${TrashDir}
#顯示幫助提示
if [[ $1 = "" ]];then
echo "[ rm ] ---- 'remove' File Or Directory"
echo " eg : rm filename"
echo " eg : rm filename1 filename2 dirname ..."
echo "[ rl ] : List trash directory file"
echo "[ rr ] : Clean trash directory"
echo "[ rg ] : Get Trash Log"
echo "[ realrm ] : original rm!!"
echo ""
echo "This [ rm ] is [ mv ]!!"
echo "The trash directory is [ ${TrashDir} ]"
echo "The trash Log is [ ${TrashLog} ]"
fi
#循環(huán) ‘刪除’ 傳入文件
#命令后面跟 -- 是參數(shù)結(jié)束標記
for i in $*
do
Dir=`pwd`
DATETIME=`date +%Y%m%d%H%M%S`
fileName=`basename -- $i`
filesize=`du -sch -- $i | awk 'END{print $1}'`
mv -- $i ${TrashDir}/${fileName}.${DATETIME}
#添加日志信息
if [[ $? -eq 0 ]];then
if [[ -d ${TrashDir}/${fileName}.${DATETIME} ]];
then
echo "-d ${fileName} ${Dir}/ ${filesize} `date +'%Y-%m-%d-%H:%M:%S'` Success " >> ${TrashLog}
elif [[ -f ${TrashDir}/${fileName}.${DATETIME} ]];
then
echo "-f ${fileName} ${Dir}/ ${filesize} `date +'%Y-%m-%d-%H:%M:%S'` Success " >> ${TrashLog}
else
echo "-- ${fileName} ${Dir}/ ${filesize} `date +'%Y-%m-%d-%H:%M:%S'` Success " >> ${TrashLog}
fi
else
if [[ -f ${TrashDir}/${fileName}.${DATETIME} ]];
then
echo "-f ${fileName} ${Dir}/ ${filesize} `date +'%Y-%m-%d-%H:%M:%S'` Failure" >> ${TrashLog}
elif [[ -d ${TrashDir}/${fileName}.${DATETIME} ]];
then
echo "-d ${fileName} ${Dir}/ ${filesize} `date +'%Y-%m-%d-%H:%M:%S'` Failure" >> ${TrashLog}
else
echo "-- ${fileName} ${Dir}/ ${filesize} `date +'%Y-%m-%d-%H:%M:%S'` Failure" >> ${TrashLog}
fi
fi
done
}
#展示回收站內(nèi)容
trash_ls()
{
#ls -lt $TrashDir
ls -lt --color $TrashDir| sort -s -k 1,1
trashsize=`du -chs ${TrashDir} | awk 'END{print $1}'`
echo "回收站總大小: ${trashsize}"
}
#清空回收站內(nèi)容
trash_rm()
{
read -p "確定清空回收站嗎(同時會刪除回收站日志)?(y/n)" action
if [ $action = "y" ];then
/bin/rm -rf ${TrashDir}*
echo "">${TrashLog}
elif [ $action = "Y" ];then
/bin/rm -rf ${TrashDir}
echo "">${TrashLog}
fi
}
#打印回收站日志
trash_log()
{
clear
cat ${TrashLog}| awk 'BEGIN{printf "%-6s %-15s %-30s %-10s %-15s %-10s\n","類型","文件名","原文件路徑","文件大小","日期","刪除狀態(tài)";
printf "---------------------------------------------------------------------------------------------------------\n"}
{ printf "%-*s %-*s %-*s %-*s %-*s %-*s\n",6,$1,15,$2,40,$3,10,$4,20,$5,10,$6}
END {printf "---------------------------------------------------------------------------------------------------------\n"}
'
}
trash_time_clean()
{
#定時刪除回收站中的文件,定時器執(zhí)行crontab
#定時刪除兩天以上的文件
find ${TrashDir} -maxdepth 1 -mtime +2 -exec rm -rf {} \;
}
#--------end 回收站
保存退出后執(zhí)行 source .bashrc,使修改立即生效
下面是回收站命令:
直接執(zhí)行rm可以顯示提示
rm 執(zhí)行的是trash函數(shù)
rg 打印刪除日志
rl 顯示回收站內(nèi)容
rr 清空回收站
realrm 真正的刪除(原rm)
如果想要定時清空回收站,可使用定時器
- 添加用戶的定時器
crontab -e打開定時器編輯文件,添加如下代碼
0 0 */2 * * trash_time_clean;
每兩天的0時0分執(zhí)行 trash_time_clean;刪除兩天以前的文件.
謝謝大家.



