回收站功能在 Linux 中的實現(xiàn)
調用 logTrashDir 腳本,將回收站中的新文件名、原文件名、刪除時間、原文件絕對路徑記錄到隱藏文件中
將文件通過 mv 命令移動到 Trash 目錄下。詳細代碼如下所示:
清單 6.移動文件到回收站并做記錄
now=`date +%Y%m%d_%H_%M_%S`
filename=${file##*/}
newfilename=${file##*/}_${now}
mark1=.
mark2=/
if [ $file = ${file/$mark2} ]
then
fullpath=$(pwd)/$file
elif [ $file != ${file/$mark1} ]
then
fullpath=$(pwd)${file/$mark1}
else
fullpath=$file
fi
echo the full path of this file is :$fullpath
if mv -f $file ~/trash/$newfilename
then
$(/logTrashDir $newfilename $filename $now $fullpath)
echo files: $file is deleted
else
echo the operation is failed
fi
logTrashDir 腳本
該腳本較簡單,僅是一個簡單的文件寫入操作,之所以單獨作為一個腳本,是為了以后擴展的方便,具體代碼如下:
清單 7.logTrashDir 代碼
if [ ! -f ~/trash/.log ]
then
touch ~/trash/.log
chmod 700~/trash/.log
fi
echo $1 $2 $3 $4>> ~/trash/.log
該腳本先建立.log 隱藏文件,然后往里添加刪除文件的記錄。
restoreTrash 腳本
該腳本主要完成以下功能:
從.log 文件中找到用戶想要恢復的文件對應的記錄。此處依然使用 awk,通過正表達式匹配找到包含被刪除文件名的一行
從記錄中找到記錄原文件名的字段,以給用戶提示
將回收站中的文件移動到原來的位置,在這里運用了 mv –b 移動文件,之所以加入-b 選項是為了防止原位置有同名文件的情況。
將.log 文件中與被恢復文件相對應的記錄刪除
清單 8.獲取相應記錄
1originalPath=$(awk /$filename/'{print $4}' $HOME/trash/.log)
清單 9.查找原文件名及現(xiàn)文件名字段
filenameNow=$(awk /$filename/'{print $1}' ~/trash/.log)
filenamebefore=$(awk /$filename/'{print $2}' ~/trash/.log)
echo you are about to restore $filenameNow,original name is $filenamebefore
echo original path is $originalPath
清單 10.恢復文件到原來位置并刪除相應記錄
echo Are you sure to do that?[Y/N]
read reply
if [ $reply = y ] || [ $reply = Y ]
then
$(mv -b $HOME/trash/$filename $originalPath)
$(sed -i /$filename/'d' $HOME/trash/.log)
else
echo no files restored
fi
自動定期清理 trash 目錄
因為 delete 操作并不是真正刪除文件,而是移動操作,經過一段時間的積累,trash 目錄可能會占用大量的硬盤空間,造成資源浪費,所以定期自動清理 trash 目錄下的文件是必須得。本文的清理規(guī)則是:在回收站中存在 7 天以上的文件及目錄將會被自動從硬盤中刪除。運用的工具是 Linux 自帶的 crontab。
Crontab 是 Linux 用來定期執(zhí)行程序的命令。當安裝完成操作系統(tǒng)之后,默認便會啟動此任務調度命令。Crontab 命令會定期檢查是否有要執(zhí)行的工作,如果有要執(zhí)行的工作便會自動執(zhí)行該工作。而 Linux 任務調度的工作主要分為以下兩類:
1、系統(tǒng)執(zhí)行的工作:系統(tǒng)周期性所要執(zhí)行的工作,如備份系統(tǒng)數(shù)據(jù)、清理緩存
2、個人執(zhí)行的工作:某個用戶定期要做的工作,例如每隔 10 分鐘檢查郵件服務器是否有新信,這些工作可由每個用戶自行設置。
首先編寫 crontab 執(zhí)行時要調用的腳本 cleanTrashCan.如清單 10 所示,該腳本主要完成兩項功能:
判斷回收站中的文件存放時間是否已超過 7 天,如果超過則從回收站中刪除。
將刪除文件在.log 文件中相應的記錄刪除,保持其中數(shù)據(jù)的有效性,提高查找效率。
清單 11.刪除存在回收站超過 7 天的文件并刪除.log 中相應記錄
arrayA=($(find ~/trash/* -mtime +7 | awk '{print $1}'))
for file in ${arrayA[@]}
do
$(rm -rf ${file})
filename=${file##*/}
echo $filename
$(sed -i /$filename/'d' $HOME/trash/.log)
done
腳本編寫完成后通過 chmod 命令賦予其執(zhí)行權限,然后運過 crontab –e 命令添加一條新的任務調度:
110 18 * * * /bin/ cleanTrashCan
該語句的含義為,在每天的下午 6 點 10 分執(zhí)行 cleanTrashCan 腳本
通過這條任務調度,trash 的大小會得到有效的控制,不會持續(xù)增大以致影響用戶的正常操作。
實際應用
首先要將 delete 腳本,logTrashDir 腳本,restoreTrash 腳本和 cleanTrashCan 放到/bin 目錄下,然后用 chmod +x delete restoreTrash logTrashDir cleanTrashCan 命令賦予這三個腳本可執(zhí)行權限。
運用 delete 腳本刪除文件,例如要刪除在/usr 目錄下的 useless 文件。根據(jù)用戶目前所在的位置,可以用相對路徑或絕對路徑來指定參數(shù),如:delete useless,delete ./useless 或者 delete /usr/useless。執(zhí)行過程如圖 1 所示:
圖 1.delete 腳本執(zhí)行過程
執(zhí)行之后,useless 文件會從原目錄中刪除,被移動到$HOME/trash 下,并被重命名,如圖 2.所示:
評論