#!/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