notes/scripts/newrm
2022-07-20 08:44:33 -07:00

64 lines
1.7 KiB
Bash
Executable file

#!/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
if [ -d .git ] ; then
for arg
do
newname="$archivedir/$(date "+%S.%M.%H.%m").$(basename "$arg")"
$copy "$arg" "$newname"
done
git rm "$@"
exit 0
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.