experimental old/new eatmydata support switch
[shellsnippets/shellsnippets.git] / mksh / series
1 #!/bin/mksh
2 # $MirOS: contrib/hosted/tg/historic/series,v 1.3 2009/10/19 20:43:48 tg Exp $
3 #-
4 # Copyright (c) 2004, 2009
5 #       Thorsten Glaser <tg@mirbsd.org>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un-
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person's immediate fault when using the work as intended.
21 #-
22 # mass renaming of files
23
24
25 # Setup
26
27 usage() {
28         print 'Usage: series [-nz] [-u <maxnos>] -s <start> -t <name> <file> ...'
29         print ' In filename template, use % character for index.'
30         exit 1
31 }
32
33 do_mv=mv
34 let minimum=1
35 series=ask
36 let index=1
37
38
39 # Option Processing
40
41 while getopts "hns:t:u:z" option; do
42         case $option in
43         h)      usage                           ;;
44         n)      do_mv="echo mv"                 ;;
45         s)      if [[ -z $OPTARG ]]; then
46                         usage
47                 else
48                         let index="$OPTARG"
49                 fi                              ;;
50         t)      series="$OPTARG"                ;;
51         u)      let maxnos="$OPTARG"            ;;
52         z)      let minimum=0                   ;;
53         *)      usage                           ;;
54         esac
55 done
56 shift $((OPTIND - 1))
57
58 (( index < minimum )) && usage
59
60 while [[ -z $series || $series = ask || $series != *@(%)* ]]; do
61         print -n 'Name of series (x to exit)? '
62         read series
63         [[ $series = x ]] && exit 2
64 done
65
66
67 # Figure out with how many zeroes to stuff
68
69 let number="index + $#"
70 (( number > maxnos )) || let number=maxnos
71
72 let digits=1
73 (( number > 9 )) && let digits=10
74 (( number > 99 )) && let digits=100
75 (( number > 999 )) && let digits=1000
76
77
78 # Do the renaming
79
80 for file in "$@"; do
81         # Generate stuffed number
82         (( index < 1 )) && let i=1 || let i=index
83         fnr=$index
84         while (( i < digits )); do
85                 fnr=0$fnr
86                 let 'i*=10'
87         done
88
89         # Generate filename with number in it
90         fname="${series%@(%)*}${fnr}${series##*@(%)}"
91
92         # Rename and loop
93         $do_mv "$file" "$fname"
94         let index+=1
95 done
96 exit 0