#!/bin/bash

# newrm--A replacement for the existing rm command.
# This script 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. 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!

archivedir="$HOME/.recycle-bin"
realrm="$(which rm)"
copy="$(which cp) -R"

if [ $# -eq 0 ] ; then # Let 'rm' output 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 ))

# BEGIN MAIN SCRIPT
# =================

if [ ! -d $archivedir  ] ; then
    if [ ! -w $HOME ] ; then
        echo "$0 failed: can't create $archivedir in $HOME " >&2
        exit 1
    fi
    mkdir $archivedir
    chmod 700 $archivedir # A little bit of privacy, please
fi

for arg
do
    newname="$archivedir/$(date "+%S.%M.%H.%m").$(basename "$arg")"
    if [ -f "$arg" -o -d "$arg" ] ; then
        $copy "$arg" "$newname"
    fi
done

exec $realrm $flags "$@" # Our shell is replaced by realrm.
