#!/bin/sh

# Order files by adding/changing numbers (like "01. ") in front of their names

usage() { echo usage: $0 [-n number width] [-s separator] 1>&2; exit 1; }

# Default values
n=2
s='. '

# Parse options
while getopts n:s: o
do
	case $o in
	n)	n=$OPTARG ;;
	s)	s=$OPTARG ;;
	?)	usage ;;
	esac
done
shift $((OPTIND-1))

# Validate options
case "$n" in
[1-9])	;;
*)	echo $0: n must be a number from 1 to 9 1>&2
	exit 1 ;;
esac
test -z "$1" && usage

# Construct glob and regex substitution from -s and -n
i=0; while test $((i++)) -lt "$n"; do sub=$sub'[0-9]'; done
glob=$sub
sub="s/^$sub$(printf '%s\n' "$s" | sed 's/\([.*[\\]\|\]\)/\\&/g')//"

totext() {
	for f in "$@"; do printf '%s\n' "$f"; done |
	sort |
	sed "$sub"
}

fromtext() {
	nl -s.\  -w2 -nrz | {
		i=1
		while read new
		do
			name=`printf '%s\n' "$new" | sed "$sub"`
			if test -e "$name"
			then mv "$name" "$new"
			else mv $glob"$s$name" "$new" 2>&-
			fi
		done
	}
}

# Edit order
totext "$@" | ep | fromtext