#!/bin/bash # Here we establish some essential variables to the program. archivedir="$HOME/.recycle-bin" # we simply refer to a directory .recycle-bin that will house copies of all our deleted files. realrm="$(which rm)" # a variable that allows us to reference the binary rm program copy="$(which cp) -R" # and the same for the cp command if [ $# -eq 0 ] ; then # if there are no arguments (i.e. the length of the array of arguments is equal to zero) exec $realrm # then simply execute the rm command fi # Parse all options looking for '-f' flags="" # a variable that will obviously hold our flags, note that it is expecting a string and not an array # the getopts command allows us to create a series of flags, note the syntax here as it will be useful in multiple programs. while getopts "dfiPRrvW" opt do # note the $opt variable is created here, very much like in a for in loop. case $opt in # in case the $opt variable is in the string above, (the "dfiPRrvW" string which indicates the various kinds of flags) f ) exec $realrm "$@" ;; # execute the rm command followed by all variables/flags that follow it * ) flags="$flags -$opt" ;; # otherwise all other flags passed are contained in the flags variable esac done shift $(( $OPTIND - 1 )) # this syntax is necessary as it is part of the getopts syntax, which then shifts through the option index ($OPTIND) by one, # essentially checking the next flag # BEGIN MAIN SCRIPT # ================= if [ ! -d $archivedir ] ; then # if the .recycle-bin directory doesn't exist... if [ ! -w $HOME ] ; then # and if the $HOME directory is NOT writable echo "$0 failed: can't create $archivedir in $HOME " >&2 # echo the message and write it to standard output exit 1 # and exit with an error status fi mkdir $archivedir # otherwise, write the .recycle-bin directory chmod 700 $archivedir # and change the permissions so only the $USER can read/write/execute the directory fi for arg # as simple as it gets for a for statement... for every argument passed (the filename(s))... do newname="$archivedir/$(date "+%S.%M.%H.%m").$(basename "$arg")" # in the variable, newname, write within the .recycle-bin directory the filename with a timestamp prepended to it if [ -f "$arg" -o -d "$arg" ] ; then # if the passed filename is a regular file and exists and/or the file's optname is true and/or is a directory... $copy "$arg" "$newname" # use the cp command to copy the arguments passed to newrm with the newname variable (i.e. copy the passed file(s) to the recycle-bin directory as the same filename with a timestampe prepended to it) fi done exec $realrm $flags "$@" # execute the rm command with the passed flags ("dfiPRrvW") and all arguments(file(s))