24
24
"
25
25
26
26
# Set default program options.
27
+ opt_date_format=' %F-%H%M'
27
28
opt_backup_full=' '
28
29
opt_backup_incremental=' '
29
30
opt_default_exclude=' '
@@ -56,6 +57,7 @@ print_usage ()
56
57
{
57
58
echo " Usage: $0 [options] [-l label] <'//' | name [name...]>
58
59
--default-exclude Exclude datasets if com.sun:auto-snapshot is unset.
60
+ -D, --date=FORMAT Date format. Default '%F-%H%M'.
59
61
-d, --debug Print debugging messages.
60
62
-e, --event=EVENT Set the com.sun:auto-snapshot-desc property to EVENT.
61
63
--fast Use a faster zfs list invocation.
@@ -144,6 +146,45 @@ do_run () # [argv]
144
146
}
145
147
146
148
149
+ setup_snap_glob ()
150
+ {
151
+ local base=" $1 "
152
+ local format=" $2 "
153
+
154
+ # The dash to mimic the separator between prefix/label
155
+ # and DATE in SNAPNAME.
156
+ echo -n " $base " -
157
+ echo $format | \
158
+ awk -v ORS=" " ' { gsub(/./,"&\n") ; print }' | \
159
+ while read char; do
160
+ [ " $char " = " %" ] && continue
161
+
162
+ if [ " $char " = " ." ]; then
163
+ echo -n " ."
164
+ elif [ " $char " = " -" ]; then
165
+ echo -n " -"
166
+ else
167
+ # Given the format char, create
168
+ # a string with only that.
169
+ # So if we said '%Y', the percentage
170
+ # sign would have been filtered out
171
+ # at the top of the loop, leaving the
172
+ # 'Y' here. So str=2014.
173
+ str=$( date +" %$char " )
174
+
175
+ # Print the lenght of that with
176
+ # question marks (4 with the '%Y'
177
+ # example above).
178
+ i=0
179
+ while [ $i -lt ${# str} ]; do
180
+ echo -n " ?"
181
+ i=$(( i + 1 ))
182
+ done
183
+ fi
184
+ done
185
+ }
186
+
187
+
147
188
do_snapshots () # properties, flags, snapname, oldglob, [targets...]
148
189
{
149
190
local PROPS=" $1 "
@@ -210,9 +251,9 @@ do_snapshots () # properties, flags, snapname, oldglob, [targets...]
210
251
GETOPT=$( getopt \
211
252
--longoptions=default-exclude,dry-run,fast,skip-scrub,recursive \
212
253
--longoptions=event:,keep:,label:,prefix:,sep: \
213
- --longoptions=debug,help,quiet,syslog,verbose \
254
+ --longoptions=date:, debug,help,quiet,syslog,verbose \
214
255
--longoptions=pre-snapshot:,post-snapshot:,destroy-only \
215
- --options=dnshe:l:k:p:rs:qgv \
256
+ --options=D: dnshe:l:k:p:rs:qgv \
216
257
-- " $@ " ) \
217
258
|| exit 128
218
259
@@ -221,6 +262,10 @@ eval set -- "$GETOPT"
221
262
while [ " $# " -gt ' 0' ]
222
263
do
223
264
case " $1 " in
265
+ (-D|--date)
266
+ opt_date_format=" $2 "
267
+ shift 2
268
+ ;;
224
269
(-d|--debug)
225
270
opt_debug=' 1'
226
271
opt_quiet=' '
@@ -530,13 +575,13 @@ SNAPPROP="-o com.sun:auto-snapshot-desc='$opt_event'"
530
575
531
576
# ISO style date; fifteen characters: YYYY-MM-DD-HHMM
532
577
# On Solaris %H%M expands to 12h34.
533
- DATE=$( date --utc +%F-%H%M )
578
+ DATE=$( date --utc +" $opt_date_format " )
534
579
535
580
# The snapshot name after the @ symbol.
536
581
SNAPNAME=" $opt_prefix ${opt_label: +$opt_sep$opt_label } -$DATE "
537
582
538
- # The expression for matching old snapshots. -YYYY-MM-DD-HHMM
539
- SNAPGLOB=" $opt_prefix ${opt_label: +?$opt_label } ???????????????? "
583
+ # The expression for matching old snapshots.
584
+ SNAPGLOB=" $( setup_snap_glob $ opt_prefix${opt_label: +?$opt_label } $opt_date_format ) "
540
585
541
586
if [ -n " $opt_do_snapshots " ]
542
587
then
0 commit comments