#!/bin/bash
#
# __copy1__
# __copy2__
#
CMD=`basename $0`

usage()
{
	echo "
usage: $CMD [options] dir(s)|file(s) ...

options:
 -d|--dirs)	  select directories instead of files
 -e|--regexp re   select files using regular expression 're'
 -x|--exec)	  select only executable files
 -r|--recurse)	  recursive (default: no)
 --nocomplain)	  don't complains about non-existent files/dirs
 --nolsb	  don't follow LSB standards exclusions

* returns filenames contained in 'directory'
* LSB (with ku addons) exclusion extension list:
  $lsb_excludes
" >&2
	exit 1
}

show_help()
{
	echo "
LSB exclusions (with ku addons):

  .bak ~		backup
  .dpkg-*		debian distro proposed/new
  .rpm*			rpm distro proposed/new
  .new .old		new and old files
  .tmp .temp		temporary
  .offline .disabled	disabled
  .log .[0-9]		logfiles
  .so .tar .ar		libs or archives
      .gz .zip		
  .ex .sample		sample files
"
}

# (MAIN)

VERBOSE=false
DEBUG=false

dirfiles=
regexp=
f_lsb=true
f_exec=false
f_recurse=false
f_dirs=false
f_complain=true
lsb_excludes=".bak .dpkg-* .rpm* .new .old .offline .tmp .temp .disabled ~ .log .so .gz .zip .tar .[0-9] .ex .sample"
filetype="f"

while [ $# != 0 ]
do
 case $1 in
  -v|--verbose)	VERBOSE=true ;;
  -q|--quiet)	VERBOSE=false ;;
  -D|--debug)	DEBUG=true ;;
  --nolsb)	f_lsb=false ;;
  -x|--exec)	f_exec=true ;;
  -r|--recurse)	f_recurse=true ;;
  -d|--dirs)	f_dirs=true ;;
  --nocomplain)	f_complain=false ;;
  -e|--regexp)
  	shift
	[ $# == 0 ] && usage
	regexp=$1
	;;
  --)		break ;;
  -h|--help)	show_help; exit 0 ;;
  -*|"")	show_help; usage ;;
  *)		dirfiles="${dirfiles}$1\n"
		;;
 esac
 shift
done
[ -z "$dirfiles" ] && usage

set -f
set -- $(echo "$lsb_excludes" | sed -e 's/\./\\./g' -e 's/\*/.*/g')
excludes="$1$"
shift
while [ $# != 0 ]
do
	excludes="$excludes|$1$"
	shift
done
set +f

$f_dirs && filetype="d"

echo -en "$dirfiles" | while read path
do
	[ -e "$path" ] || {
		$f_complain && echo "warn, not existent: '$path'" >&2
		continue
	}

	(
	  if [ -f "$path" ]
	  then
		ls "$path" 2>/dev/null
	  else
		if $f_recurse
		then
			find "$path" -type $filetype 2>/dev/null | sed -e 's#^\./##'
		else
			ls -d "$path/"* 2>/dev/null
		fi
	  fi
	) | sort | while read fname
	do
		case $(basename "$fname") in
		  .*) continue ;;
		esac

		[ -$filetype "$fname" ] || continue
		[ -z "$regexp" ] || {
			echo "$fname" | egrep -q "$regexp" || continue
		}
		$f_lsb && {
			echo "$fname" | egrep -q "$excludes" && continue
		}
		$f_exec && {
			[ -x "$fname" ] || continue
		}
		echo "$fname"
	done
done

exit 0
