眾所周知,linux是沒有回收站的,一些人很害怕刪錯東西(有經驗的linux管理員極少範這錯誤),個人不建議回收站,而應該是培養個人的安全意識。有點小跑題。
接著回來101個指令碼之#15 Archiving Files As They`re Removed 就是建立一個linux回收站的指令碼
The Code
#!/bin/sh
# newrm, a replacement for the existing rm command, provides a
# rudimentary unremove capability by creating and utilizing a new
# directory within the user`s home directory. It can handle directories
# of content as well as individual files, and if the user specifies
# the -f flag files are removed and NOT archived.
# Big Important Warning: You`ll want a cron job or something similar to keep
# the trash directories tamed. Otherwise nothing will ever actually
# be deleted from the system and you`ll run out of disk space!
mydir=”$HOME/.deleted-files”
realrm=”/bin/rm”
copy=”/bin/cp -R”
if [ $# -eq 0 ] ; then # let `rm` ouptut the usage error
exec $realrm # our shell is replaced by /bin/rm
fi
# Parse all options looking for `-f`
flags=””
while getopts “dfiPRrvW” opt
do
case $opt in
f) exec $realrm “$@” ;; # exec lets us exit this script directly.
*) flags=”$flags -$opt” ;; # other flags are for `rm`, not us
esac
done
shift $(($OPTIND – 1))
# Make sure that the $mydir exists
if [ ! -d $mydir ] ; then
if [ ! -w $HOME ] ; then
echo “$0 failed: can`t create $mydir in $HOME” >&2
exit 1
fi
mkdir $mydir
chmod 700 $mydir # a little bit of privacy, please
fi
for arg
do
newname=”$mydir/$(date “+%S.%M.%H.%d.%m”).$(basename “$arg”)”
if [ -f “$arg” ] ; then
$copy “$arg” “$newname”
elif [ -d “$arg” ] ; then
$copy “$arg” “$newname”
fi
done
exec $realrm $flags “$@” # our shell is replaced by realrm
我們來說下這個指令碼的實現思路
將原本的rm命令用我們這個帶有回收站機制的myrm指令碼代替(alias別名),指令碼將要刪除的檔案移動到了home下個人目錄中以.deleted-files 命名的隱藏資料夾。
接著我們看看這個指令碼是怎麼實現的
while getopts “dfiPRrvW” opt
do
case $opt in
f) exec $realrm “$@” ;; # exec lets us exit this script directly.
*) flags=”$flags -$opt” ;; # other flags are for `rm`, not us
esac
done
這一段說明 要是命令用帶 –f 選項的話,則不進回收站,呼叫原本的rm命令。
for arg
do
newname=”$mydir/$(date “+%S.%M.%H.%d.%m”).$(basename “$arg”)”
if [ -f “$arg” ] ; then
$copy “$arg” “$newname”
elif [ -d “$arg” ] ; then
$copy “$arg” “$newname”
fi
done
用for迴圈順序處理引數
newname=”$mydir/$(date “+%S.%M.%H.%d.%m”).$(basename “$arg”)” 回收站裡檔案命名.