#!/bin/bash
#
# List and remove unnecessary files in directories
#
# Usage: cleanup [ [ -r | -R ] [ -i | f ] directory-name ]+
#   -r | -R clean specified directory and all subdirectories
#   -i | -f prompt or not prompt for each file removal
# Examples:
#   $ cleanup jfdoe
#   $ cleanup -R .
#   $ cleanup -r dir1 -i dir2 -r -f dir3
# Limitations:
#   * only removes files named: core, a.out, *.o, *.d
#   * does not handle file names with special characters

usage() {					# print usage message & terminate
    echo "Usage: ${0} [ [ -r | -R ] [ -i | -f ] directory-name ]+" 1>&2
    exit 1
}
defaults() {					# defaults for each directory
    prompt="-i"					# prompt for removal
    depth="-maxdepth 1"				# not recursive
}

remove() {
    for file in `find "${1}" ${depth} -type f -a \( -name 'core' -o \
	-name 'a.out' -o -name '*.o' -o -name '*.d' \)`
    do
	echo "${file}"				# print removed file
	rm "${prompt}" "${file}"
    done
}

if [ ${#} -eq 0 ] ; then usage ; fi		# no arguments ?
defaults					# set defaults for directory
while [ ${#} -gt 0 ] ; do			# process command-line arguments
    case "${1}" in
      "-r" | "-R" ) depth="" ;;			# recursive ?
      "-i" | "-f" ) prompt="${1}" ;;		# prompt for deletion ?
      "-h" | --help | -* ) usage ;;		# help ?
      * )					# directory name ?
      if [ ! -x "${1}" ] ; then			# directory exist and searchable ?
	    echo "${1} does not exist or is not searchable" 1>&2
	else
	    remove "${1}"			# remove files in directory
	    defaults				# reset defaults for next directory
	fi
	;;
    esac
    shift					# remove argument
done
exit 0
