眾所周知,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”)” 回收站裡檔案命名.