Hello, My apologies for not being able to respond earlier.
> I'd like to ask for a feature. It should be easier and more precise if > you could use the following tags on a -L option: > K = kilobytes > M = Megabytes > G = Gigabytes > T = Terabytes Yes, that's reasonable. I have installed the attached patch. It allows for using suffix prefixes with -L and --record-size options. Notice, that if the argument to -L has no size suffix, it is still treated as kilobytes. > Also, auto-renaming would be awesome so I didn't have to type n > newname2.tar.lzma. It should handle this for itself, no? It can be done using the --new-volume-script option with the script from subsection 9.6.1 of the Tar Manual[1]. Regards, Sergey [1] http://www.gnu.org/software/tar/manual/html_node/Multi_002dVolume-Archives.html
>From c1b30c268f8517bfe61fe253a34613584351efc0 Mon Sep 17 00:00:00 2001 From: Sergey Poznyakoff <[email protected]> Date: Sat, 17 Jul 2010 11:38:08 +0300 Subject: [PATCH] Allow for size suffixes in -L and --record-size options. * src/tar.c (TAR_SIZE_SUFFIXES): New define. (parse_opt): Allow for size suffixes in arguments to -L and --record-size options. * NEWS, doc/tar.texi: Update. --- NEWS | 7 +++++- doc/tar.texi | 61 ++++++++++++++++++++++++++++++++++++++++++++++----------- src/tar.c | 14 ++++++++++-- 3 files changed, 66 insertions(+), 16 deletions(-) diff --git a/NEWS b/NEWS index 11d3fa0..a84873d 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,4 @@ -GNU tar NEWS - User visible changes. 2010-03-28 +GNU tar NEWS - User visible changes. 2010-07-16 Please send GNU tar bug reports to <[email protected]> @@ -48,6 +48,11 @@ update of an archive: This did not work in previous versions, in spite of what the docs said. +** --record-size and --tape-length (-L) options + +Usual size suffixes are allowed for these options. For example, +-L10k stands for a 10 kilobyte tape length. + ** Fix dead loop on extracting existing symlinks with the -k option. diff --git a/doc/tar.texi b/doc/tar.texi index 30fa61f..52b774c 100644 --- a/doc/tar.texi +++ b/doc/tar.texi @@ -3153,10 +3153,13 @@ Specifies that @command{tar} should reblock its input, for reading from pipes on systems with buggy implementations. @xref{Reading}. @opsummary{record-size} -...@item --record-si...@var{size} +...@item --record-si...@var{size}[@var{suf}] Instructs @command{tar} to use @var{size} bytes per record when accessing the -archive. @xref{Blocking Factor}. +archive. The argument can be suffixed with a @dfn{size suffix}, e.g. +...@option{--record-size=10k} for 10 Kilobytes. @xref{size-suffixes}, +for a list of valid suffixes. @xref{Blocking Factor}, for a detailed +description of this option. @opsummary{recursion} @item --recursion @@ -3306,11 +3309,15 @@ Alters the suffix @command{tar} uses when backing up files from the default @samp{~}. @xref{backup}. @opsummary{tape-length} -...@item --tape-leng...@var{num} -...@itemx -L @var{num} +...@item --tape-leng...@var{num}[@var{suf}] +...@itemx -L @var{nu...@var{suf}] Specifies the length of tapes that @command{tar} is writing as being -...@w{@var{num} x 1024} bytes long. @xref{Using Multiple Tapes}. +...@w{@var{num} x 1024} bytes long. If optional @var{suf} is given, it +specifies a multiplicative factor to be used instead of 1024. For +example, @samp{-L2M} means 2 megabytes. @xref{size-suffixes}, for a +list of allowed suffixes. @xref{Using Multiple Tapes}, for a detailed +discussion of this option. @opsummary{test-label} @item --test-label @@ -10345,8 +10352,27 @@ that may be larger than will fit on the medium used to hold it. @xopindex{tape-length, short description} @item -L @var{num} -...@itemx --tape-leng...@var{num} -Change tape after writing @var{num} x 1024 bytes. +...@itemx --tape-leng...@var{size}[@var{suf}] +Change tape after writing @var{size} units of data. Unless @var{suf} is +given, @var{size} is treated as kilobytes, i.e. @sa...@var{size} x +1024} bytes. The following suffixes alter this behavior: + +...@float Table, size-suffixes +...@caption{size Suffixes} +...@multitable @columnfractions 0.2 0.3 0.3 +...@headitem Suffix @tab Units @tab Byte Equivalent +...@item b @tab Blocks @tab @var{size} x 512 +...@item B @tab Kilobytes @tab @var{size} x 1024 +...@item c @tab Bytes @tab @var{size} +...@item G @tab Gigabytes @tab @var{size} x 1024^3 +...@item K @tab Kilobytes @tab @var{size} x 1024 +...@item k @tab Kilobytes @tab @var{size} x 1024 +...@item M @tab Megabytes @tab @var{size} x 1024^2 +...@item P @tab Petabytes @tab @var{size} x 1024^5 +...@item T @tab Terabytes @tab @var{size} x 1024^4 +...@item w @tab Words @tab @var{size} x 2 +...@end multitable +...@end float This option might be useful when your tape drivers do not properly detect end of physical tapes. By being slightly conservative on the @@ -11154,15 +11180,26 @@ tape: @anchor{tape-length} @table @option @opindex tape-length -...@item --tape-leng...@var{size} -...@itemx -L @var{size} -Set maximum length of a volume. The @var{size} argument should then -be the usable size of the tape in units of 1024 bytes. This option -selects @option{--multi-volume} automatically. For example: +...@item --tape-leng...@var{size}[@var{suf}] +...@itemx -L @var{siz...@var{suf}] +Set maximum length of a volume. The @var{suf}, if given, specifies +units in which @var{size} is expressed, e.g. @samp{2M} mean 2 +megabytes (@pxref{size-suffixes}, for a list of allowed size +suffixes). Without @var{suf}, units of 1024 bytes (kilobyte) are +assumed. + +This option selects @option{--multi-volume} automatically. For example: @smallexample $ @kbd{tar --create --tape-length=41943040 --file=/dev/tape @var{files}} @end smallexample + +...@noindent +or, which is equivalent: + +...@smallexample +$ @kbd{tar --create --tape-length=4G --file=/dev/tape @var{files}} +...@end smallexample @end table @anchor{change volume prompt} diff --git a/src/tar.c b/src/tar.c index 5b61144..10ba8a9 100644 --- a/src/tar.c +++ b/src/tar.c @@ -1364,6 +1364,8 @@ expand_pax_option (struct tar_args *targs, const char *arg) } +#define TAR_SIZE_SUFFIXES "bBcGgkKMmPTtw" + static error_t parse_opt (int key, char *arg, struct argp_state *state) { @@ -1506,10 +1508,15 @@ parse_opt (int key, char *arg, struct argp_state *state) case 'L': { uintmax_t u; - if (xstrtoumax (arg, 0, 10, &u, "") != LONGINT_OK) + char *p; + + if (xstrtoumax (arg, &p, 10, &u, TAR_SIZE_SUFFIXES) != LONGINT_OK) USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg), _("Invalid tape length"))); - tape_length_option = 1024 * (tarlong) u; + if (p > arg && !strchr (TAR_SIZE_SUFFIXES, p[-1])) + tape_length_option = 1024 * (tarlong) u; + else + tape_length_option = (tarlong) u; multi_volume_option = true; } break; @@ -1961,7 +1968,8 @@ parse_opt (int key, char *arg, struct argp_state *state) case RECORD_SIZE_OPTION: { uintmax_t u; - if (! (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK + + if (! (xstrtoumax (arg, NULL, 10, &u, TAR_SIZE_SUFFIXES) == LONGINT_OK && u == (size_t) u)) USAGE_ERROR ((0, 0, "%s: %s", quotearg_colon (arg), _("Invalid record size"))); -- 1.6.0.3
