#!/bin/sh # trm.sh - Safer 'rm' # Copyright (c) 2016 TundraWare Inc., Des Plaines, IL USA # All Rights Reserved # Permission granted for the free use of this program without restriction GRAVEYARD="${HOME}/.graveyard" TESTING="Running in test mode ..." mkdir -p $GRAVEYARD # This function is called at the bottom of this file or it can # be embedded in a shell startup script. trm() { # Parse command line args OPERATOR="mv" # Can be overriden with -c option OPTLIST='cdg:tsvx' # List of all legal command line options OPTIND=1 # getopts may have been previously used in this context TESTMODE=${TESTING} VERBOSE="" while getopts ${OPTLIST} opt do case $opt in # Copy, don't move, targets to graveyard c) OPERATOR="cp -pr" ;; # Empty the graveyard d) rm -rf ${VERBOSE} ${GRAVEYARD}/* ${GRAVEYARD}/.[-z]* ;; # Name your own graveyard g) GRAVEYARD=${OPTARG} ;; # Expand symlinks s) SYMEXPAND="symexpand" ;; # Don't do anything, just show what you would do t) TESTMODE=${TESTING} ;; # Be noisy v) VERBOSE="-v" ;; # Actually execute x) TESTMODE="" ;; *) echo "usage: trm.sh -${OPTLIST} [file|directory] ..." exit 1 ;; esac done # Process arguments shift $((OPTIND-1)) for arg in $* do # Only expand symlinks if we ask for it if [ -L $arg ] then # Expand the symlink if [ -n "${SYMEXPAND}" ] then REALPATH=$(readlink $arg) # Treat the symlink as a normal file else REALPATH=$(readlink -f $(dirname $arg))/$arg fi # Process normal files and directories else REALPATH=$(readlink -f $arg) fi SRCDIR=$(dirname $REALPATH) SRCFIL=$(basename $REALPATH) DESDIR=${GRAVEYARD}${SRCDIR} SERIAL=$(date +%Y%m%d%s%N) DESFIL="${SRCFIL}.${SERIAL}" CMD="${OPERATOR} $VERBOSE '${REALPATH}' '${DESDIR}/${DESFIL}'" if [ -n "${TESTMODE}" ] then echo ${TESTMODE} echo ${CMD} else mkdir -p ${DESDIR} eval ${CMD} fi done } trm $*