瀏覽代碼

(options): Improved sorting. Document --backup=off.
(decode_options): Clear backup_option if necessary.

Sergey Poznyakoff 20 年之前
父節點
當前提交
cd02b0855c
共有 1 個文件被更改,包括 149 次插入133 次删除
  1. 149 133
      src/tar.c

+ 149 - 133
src/tar.c

@@ -252,6 +252,7 @@ Examples:\n\
   tar -xf archive.tar          # Extract all files from archive.tar.\n\
   tar -xf archive.tar          # Extract all files from archive.tar.\n\
 \vThe backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
 \vThe backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
 The version control may be set with --backup or VERSION_CONTROL, values are:\n\n\
+  none, off       never make backups\n\
   t, numbered     make numbered backups\n\
   t, numbered     make numbered backups\n\
   nil, existing   numbered if numbered backups exist, simple otherwise\n\
   nil, existing   numbered if numbered backups exist, simple otherwise\n\
   never, simple   always make simple backups\n");
   never, simple   always make simple backups\n");
@@ -298,32 +299,8 @@ static struct argp_option options[] = {
   {NULL, 0, NULL, 0,
   {NULL, 0, NULL, 0,
    N_("Operation modifiers:"), 20},
    N_("Operation modifiers:"), 20},
 
 
-  {"verify", 'W', 0, 0,
-   N_("attempt to verify the archive after writing it"), 21 },
-  {"remove-files", REMOVE_FILES_OPTION, 0, 0,
-   N_("remove files after adding them to the archive"), 21 },
-  {"keep-old-files", 'k', 0, 0,
-   N_("don't replace existing files when extracting"), 21 },
-  {"keep-newer-files", KEEP_NEWER_FILES_OPTION, 0, 0,
-   N_("don't replace existing files that are newer than their archive copies"), 21 },
-  {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION, 0, 0,
-   N_("preserve metadata of existing directories"), 21 },
-  {"overwrite", OVERWRITE_OPTION, 0, 0,
-   N_("overwrite existing files when extracting"), 21 },
-  {"unlink-first", 'U', 0, 0,
-   N_("remove each file prior to extracting over it"), 21 },
-  {"recursive-unlink", RECURSIVE_UNLINK_OPTION, 0, 0,
-   N_("empty hierarchies prior to extracting directory"), 21 },
   {"sparse", 'S', 0, 0,
   {"sparse", 'S', 0, 0,
    N_("handle sparse files efficiently"), 21 },
    N_("handle sparse files efficiently"), 21 },
-  {"to-stdout", 'O', 0, 0,
-   N_("extract files to standard output"), 21 },
-  {"to-command", TO_COMMAND_OPTION, N_("COMMAND"), 0,
-   N_("pipe extracted files to another program"), 21 },
-  {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION, 0, 0,
-   N_("ignore exit codes of children"), 21 },
-  {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION, 0, 0,
-   N_("treat non-zero exit codes of children as error"), 21 },
   {"incremental", 'G', 0, 0,
   {"incremental", 'G', 0, 0,
    N_("handle old GNU-format incremental backup"), 21 },
    N_("handle old GNU-format incremental backup"), 21 },
   {"listed-incremental", 'g', N_("FILE"), 0,
   {"listed-incremental", 'g', N_("FILE"), 0,
@@ -334,221 +311,254 @@ static struct argp_option options[] = {
    N_("process only the NUMBERth occurrence of each file in the archive. This option is valid only in conjunction with one of the subcommands --delete, --diff, --extract or --list and when a list of files is given either on the command line or via -T option. NUMBER defaults to 1."), 21 },
    N_("process only the NUMBERth occurrence of each file in the archive. This option is valid only in conjunction with one of the subcommands --delete, --diff, --extract or --list and when a list of files is given either on the command line or via -T option. NUMBER defaults to 1."), 21 },
   {"seek", 'n', NULL, 0,
   {"seek", 'n', NULL, 0,
    N_("Archive is seekable"), 21 },
    N_("Archive is seekable"), 21 },
+
+  {NULL, 0, NULL, 0,
+   N_("Overwrite control:"), 30},
+
+  {"verify", 'W', 0, 0,
+   N_("attempt to verify the archive after writing it"), 31 },
+  {"remove-files", REMOVE_FILES_OPTION, 0, 0,
+   N_("remove files after adding them to the archive"), 31 },
+  {"keep-old-files", 'k', 0, 0,
+   N_("don't replace existing files when extracting"), 31 },
+  {"keep-newer-files", KEEP_NEWER_FILES_OPTION, 0, 0,
+   N_("don't replace existing files that are newer than their archive copies"), 31 },
+  {"overwrite", OVERWRITE_OPTION, 0, 0,
+   N_("overwrite existing files when extracting"), 31 },
+  {"unlink-first", 'U', 0, 0,
+   N_("remove each file prior to extracting over it"), 31 },
+  {"recursive-unlink", RECURSIVE_UNLINK_OPTION, 0, 0,
+   N_("empty hierarchies prior to extracting directory"), 31 },
+  {"no-overwrite-dir", NO_OVERWRITE_DIR_OPTION, 0, 0,
+   N_("preserve metadata of existing directories"), 31 },
+
+  {NULL, 0, NULL, 0,
+   N_("Select output stream:"), 40},
+
+  {"to-stdout", 'O', 0, 0,
+   N_("extract files to standard output"), 41 },
+  {"to-command", TO_COMMAND_OPTION, N_("COMMAND"), 0,
+   N_("pipe extracted files to another program"), 41 },
+  {"ignore-command-error", IGNORE_COMMAND_ERROR_OPTION, 0, 0,
+   N_("ignore exit codes of children"), 41 },
+  {"no-ignore-command-error", NO_IGNORE_COMMAND_ERROR_OPTION, 0, 0,
+   N_("treat non-zero exit codes of children as error"), 41 },
     
     
   {NULL, 0, NULL, 0,
   {NULL, 0, NULL, 0,
-   N_("Handling of file attributes:"), 30 },
+   N_("Handling of file attributes:"), 50 },
 
 
   {"owner", OWNER_OPTION, N_("NAME"), 0,
   {"owner", OWNER_OPTION, N_("NAME"), 0,
-   N_("force NAME as owner for added files"), 31 },
+   N_("force NAME as owner for added files"), 51 },
   {"group", GROUP_OPTION, N_("NAME"), 0,
   {"group", GROUP_OPTION, N_("NAME"), 0,
-   N_("force NAME as group for added files"), 31 },
+   N_("force NAME as group for added files"), 51 },
   {"mode", MODE_OPTION, N_("CHANGES"), 0,
   {"mode", MODE_OPTION, N_("CHANGES"), 0,
-   N_("force (symbolic) mode CHANGES for added files"), 31 },
+   N_("force (symbolic) mode CHANGES for added files"), 51 },
   {"atime-preserve", ATIME_PRESERVE_OPTION, 0, 0,
   {"atime-preserve", ATIME_PRESERVE_OPTION, 0, 0,
-   N_("don't change access times on dumped files"), 31 },
+   N_("don't change access times on dumped files"), 51 },
   {"touch", 'm', 0, 0,
   {"touch", 'm', 0, 0,
-   N_("don't extract file modified time"), 31 },
+   N_("don't extract file modified time"), 51 },
   {"same-owner", SAME_OWNER_OPTION, 0, 0,
   {"same-owner", SAME_OWNER_OPTION, 0, 0,
-   N_("try extracting files with the same ownership"), 31 },
+   N_("try extracting files with the same ownership"), 51 },
   {"no-same-owner", NO_SAME_OWNER_OPTION, 0, 0,
   {"no-same-owner", NO_SAME_OWNER_OPTION, 0, 0,
-   N_("extract files as yourself"), 31 },
+   N_("extract files as yourself"), 51 },
   {"numeric-owner", NUMERIC_OWNER_OPTION, 0, 0,
   {"numeric-owner", NUMERIC_OWNER_OPTION, 0, 0,
-   N_("always use numbers for user/group names"), 31 },
+   N_("always use numbers for user/group names"), 51 },
   {"preserve-permissions", 'p', 0, 0,
   {"preserve-permissions", 'p', 0, 0,
-   N_("extract information about file permissions (default for superuser)"), 31 },
-  {"same-permissions", 0, 0, OPTION_ALIAS, NULL, 31 },
+   N_("extract information about file permissions (default for superuser)"),
+   51 },
+  {"same-permissions", 0, 0, OPTION_ALIAS, NULL, 51 },
   {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION, 0, 0,
   {"no-same-permissions", NO_SAME_PERMISSIONS_OPTION, 0, 0,
-   N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), 31 },
+   N_("apply the user's umask when extracting permissions from the archive (default for ordinary users)"), 51 },
   {"preserve-order", 's', 0, 0,
   {"preserve-order", 's', 0, 0,
-   N_("sort names to extract to match archive"), 31 },
-  {"same-order", 0, 0, OPTION_ALIAS, NULL, 31 },
+   N_("sort names to extract to match archive"), 51 },
+  {"same-order", 0, 0, OPTION_ALIAS, NULL, 51 },
   {"preserve", PRESERVE_OPTION, 0, 0,
   {"preserve", PRESERVE_OPTION, 0, 0,
-   N_("same as both -p and -s"), 31 },
+   N_("same as both -p and -s"), 51 },
 
 
   {NULL, 0, NULL, 0,
   {NULL, 0, NULL, 0,
-   N_("Device selection and switching:"), 40 },
+   N_("Device selection and switching:"), 60 },
   
   
   {"file", 'f', N_("ARCHIVE"), 0,
   {"file", 'f', N_("ARCHIVE"), 0,
-   N_("use archive file or device ARCHIVE"), 41 },
+   N_("use archive file or device ARCHIVE"), 61 },
   {"force-local", FORCE_LOCAL_OPTION, 0, 0,
   {"force-local", FORCE_LOCAL_OPTION, 0, 0,
-   N_("archive file is local even if has a colon"), 41 },
+   N_("archive file is local even if has a colon"), 61 },
   {"rmt-command", RMT_COMMAND_OPTION, N_("COMMAND"), 0,
   {"rmt-command", RMT_COMMAND_OPTION, N_("COMMAND"), 0,
-   N_("use given rmt COMMAND instead of rmt"), 41 }, 
+   N_("use given rmt COMMAND instead of rmt"), 61 }, 
   {"rsh-command", RSH_COMMAND_OPTION, N_("COMMAND"), 0,
   {"rsh-command", RSH_COMMAND_OPTION, N_("COMMAND"), 0,
-   N_("use remote COMMAND instead of rsh"), 41 },
+   N_("use remote COMMAND instead of rsh"), 61 },
 #ifdef DEVICE_PREFIX
 #ifdef DEVICE_PREFIX
   {"-[0-7][lmh]", 0, NULL, OPTION_DOC, /* It is OK, since `name' will never be
   {"-[0-7][lmh]", 0, NULL, OPTION_DOC, /* It is OK, since `name' will never be
 					  translated */
 					  translated */
-   N_("specify drive and density"), 41 },
+   N_("specify drive and density"), 61 },
 #endif  
 #endif  
-  {NULL, '0', NULL, OPTION_HIDDEN, NULL, 41 },
-  {NULL, '1', NULL, OPTION_HIDDEN, NULL, 41 },
-  {NULL, '2', NULL, OPTION_HIDDEN, NULL, 41 },
-  {NULL, '3', NULL, OPTION_HIDDEN, NULL, 41 },
-  {NULL, '4', NULL, OPTION_HIDDEN, NULL, 41 },
-  {NULL, '5', NULL, OPTION_HIDDEN, NULL, 41 },
-  {NULL, '6', NULL, OPTION_HIDDEN, NULL, 41 },
-  {NULL, '7', NULL, OPTION_HIDDEN, NULL, 41 },
-  {NULL, '8', NULL, OPTION_HIDDEN, NULL, 41 },
-  {NULL, '9', NULL, OPTION_HIDDEN, NULL, 41 },
+  {NULL, '0', NULL, OPTION_HIDDEN, NULL, 61 },
+  {NULL, '1', NULL, OPTION_HIDDEN, NULL, 61 },
+  {NULL, '2', NULL, OPTION_HIDDEN, NULL, 61 },
+  {NULL, '3', NULL, OPTION_HIDDEN, NULL, 61 },
+  {NULL, '4', NULL, OPTION_HIDDEN, NULL, 61 },
+  {NULL, '5', NULL, OPTION_HIDDEN, NULL, 61 },
+  {NULL, '6', NULL, OPTION_HIDDEN, NULL, 61 },
+  {NULL, '7', NULL, OPTION_HIDDEN, NULL, 61 },
+  {NULL, '8', NULL, OPTION_HIDDEN, NULL, 61 },
+  {NULL, '9', NULL, OPTION_HIDDEN, NULL, 61 },
   
   
   {"multi-volume", 'M', 0, 0,
   {"multi-volume", 'M', 0, 0,
-   N_("create/list/extract multi-volume archive"), 41 },
+   N_("create/list/extract multi-volume archive"), 61 },
   {"tape-length", 'L', N_("NUMBER"), 0,
   {"tape-length", 'L', N_("NUMBER"), 0,
-   N_("change tape after writing NUMBER x 1024 bytes"), 41 },
+   N_("change tape after writing NUMBER x 1024 bytes"), 61 },
   {"info-script", 'F', N_("NAME"), 0,
   {"info-script", 'F', N_("NAME"), 0,
-   N_("run script at end of each tape (implies -M)"), 41 },
-  {"new-volume-script", 0, 0, OPTION_ALIAS, NULL, 41 },
+   N_("run script at end of each tape (implies -M)"), 61 },
+  {"new-volume-script", 0, 0, OPTION_ALIAS, NULL, 61 },
   {"volno-file", VOLNO_FILE_OPTION, N_("FILE"), 0,
   {"volno-file", VOLNO_FILE_OPTION, N_("FILE"), 0,
-   N_("use/update the volume number in FILE"), 41 },
+   N_("use/update the volume number in FILE"), 61 },
 
 
   {NULL, 0, NULL, 0,
   {NULL, 0, NULL, 0,
-   N_("Device blocking:"), 50 },
+   N_("Device blocking:"), 70 },
 
 
   {"blocking-factor", 'b', N_("BLOCKS"), 0,
   {"blocking-factor", 'b', N_("BLOCKS"), 0,
-   N_("BLOCKS x 512 bytes per record"), 51 },
+   N_("BLOCKS x 512 bytes per record"), 71 },
   {"record-size", RECORD_SIZE_OPTION, N_("NUMBER"), 0,
   {"record-size", RECORD_SIZE_OPTION, N_("NUMBER"), 0,
-   N_("SIZE bytes per record, multiple of 512"), 51 },
+   N_("SIZE bytes per record, multiple of 512"), 71 },
   {"ignore-zeros", 'i', 0, 0,
   {"ignore-zeros", 'i', 0, 0,
-   N_("ignore zeroed blocks in archive (means EOF)"), 51 },
+   N_("ignore zeroed blocks in archive (means EOF)"), 71 },
   {"read-full-records", 'B', 0, 0,
   {"read-full-records", 'B', 0, 0,
-   N_("reblock as we read (for 4.2BSD pipes)"), 51 }, 
+   N_("reblock as we read (for 4.2BSD pipes)"), 71 }, 
 
 
   {NULL, 0, NULL, 0,
   {NULL, 0, NULL, 0,
-   N_("Archive format selection:"), 60 },
+   N_("Archive format selection:"), 80 },
   
   
   {"format", 'H', N_("FORMAT"), 0,
   {"format", 'H', N_("FORMAT"), 0,
-   N_("create archive of the given format."), 61 },
+   N_("create archive of the given format."), 81 },
 
 
-  {NULL, 0, NULL, 0, N_("FORMAT is one of the following:"), 62 },
-  {"  v7", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("old V7 tar format"), 63},
+  {NULL, 0, NULL, 0, N_("FORMAT is one of the following:"), 82 },
+  {"  v7", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("old V7 tar format"), 83},
   {"  oldgnu", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
   {"  oldgnu", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
-   N_("GNU format as per tar <= 1.12"), 63},
+   N_("GNU format as per tar <= 1.12"), 83},
   {"  gnu", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
   {"  gnu", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
-   N_("GNU tar 1.13.x format"), 63},
+   N_("GNU tar 1.13.x format"), 83},
   {"  ustar", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
   {"  ustar", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
-   N_("POSIX 1003.1-1988 (ustar) format"), 63 },
+   N_("POSIX 1003.1-1988 (ustar) format"), 83 },
   {"  pax", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
   {"  pax", 0, NULL, OPTION_DOC|OPTION_NO_TRANS,
-   N_("POSIX 1003.1-2001 (pax) format"), 63 },
-  {"  posix", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("Same as pax"), 63 },
+   N_("POSIX 1003.1-2001 (pax) format"), 83 },
+  {"  posix", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, N_("Same as pax"), 83 },
   
   
   {"old-archive", OLD_ARCHIVE_OPTION, 0, 0, /* FIXME */
   {"old-archive", OLD_ARCHIVE_OPTION, 0, 0, /* FIXME */
-   N_("same as --format=v7"), 68 },
-  {"portability", 0, 0, OPTION_ALIAS, NULL, 68 },
+   N_("same as --format=v7"), 88 },
+  {"portability", 0, 0, OPTION_ALIAS, NULL, 88 },
   {"posix", POSIX_OPTION, 0, 0,
   {"posix", POSIX_OPTION, 0, 0,
-   N_("same as --format=posix"), 68 },
+   N_("same as --format=posix"), 88 },
   {"pax-option", PAX_OPTION, N_("keyword[[:]=value][,keyword[[:]=value], ...]"), 0,
   {"pax-option", PAX_OPTION, N_("keyword[[:]=value][,keyword[[:]=value], ...]"), 0,
-   N_("control pax keywords"), 68 },
+   N_("control pax keywords"), 88 },
   {"label", 'V', N_("TEXT"), 0,
   {"label", 'V', N_("TEXT"), 0,
-   N_("create archive with volume name NAME. At list/extract time, use TEXT as a globbing pattern"), 68 },
+   N_("create archive with volume name NAME. At list/extract time, use TEXT as a globbing pattern"), 88 },
   {"bzip2", 'j', 0, 0,
   {"bzip2", 'j', 0, 0,
-   N_("filter the archive through bzip2"), 68 },
+   N_("filter the archive through bzip2"), 88 },
   {"gzip", 'z', 0, 0,
   {"gzip", 'z', 0, 0,
-   N_("filter the archive through gzip"), 68 },
-  {"gunzip", 0, 0, OPTION_ALIAS, NULL, 68 },
-  {"ungzip", 0, 0, OPTION_ALIAS, NULL, 68 },
+   N_("filter the archive through gzip"), 88 },
+  {"gunzip", 0, 0, OPTION_ALIAS, NULL, 88 },
+  {"ungzip", 0, 0, OPTION_ALIAS, NULL, 88 },
   {"compress", 'Z', 0, 0,
   {"compress", 'Z', 0, 0,
-   N_("filter the archive through compress"), 68 },
-  {"uncompress", 0, 0, OPTION_ALIAS, NULL, 68 },
+   N_("filter the archive through compress"), 88 },
+  {"uncompress", 0, 0, OPTION_ALIAS, NULL, 88 },
   {"use-compress-program", USE_COMPRESS_PROGRAM_OPTION, N_("PROG"), 0,
   {"use-compress-program", USE_COMPRESS_PROGRAM_OPTION, N_("PROG"), 0,
-   N_("filter through PROG (must accept -d)"), 68 },
+   N_("filter through PROG (must accept -d)"), 88 },
 
 
   {NULL, 0, NULL, 0,
   {NULL, 0, NULL, 0,
-   N_("Local file selection:"), 70 },
+   N_("Local file selection:"), 90 },
 
 
   {"add-file", ARGP_KEY_ARG, N_("FILE"), 0,
   {"add-file", ARGP_KEY_ARG, N_("FILE"), 0,
-   N_("add given file to the archive (useful if FILE name starts with a dash)"), 71},
+   N_("add given file to the archive (useful if FILE name starts with a dash)"), 91},
   {"directory", 'C', N_("DIR"), 0,
   {"directory", 'C', N_("DIR"), 0,
-   N_("change to directory DIR"), 71 },
+   N_("change to directory DIR"), 91 },
   {"files-from", 'T', N_("FILE-OF-NAMES"), 0,
   {"files-from", 'T', N_("FILE-OF-NAMES"), 0,
-   N_("get names to extract or create from file NAME"), 71 },
+   N_("get names to extract or create from file NAME"), 91 },
   {"null", NULL_OPTION, 0, 0,
   {"null", NULL_OPTION, 0, 0,
-   N_("-T reads null-terminated names, disable -C"), 71 },
+   N_("-T reads null-terminated names, disable -C"), 91 },
   {"unquote", UNQUOTE_OPTION, 0, 0,
   {"unquote", UNQUOTE_OPTION, 0, 0,
-   N_("Unquote filenames read with -T (default)"), 71 },
+   N_("Unquote filenames read with -T (default)"), 91 },
   {"no-unquote", NO_UNQUOTE_OPTION, 0, 0,
   {"no-unquote", NO_UNQUOTE_OPTION, 0, 0,
-   N_("Do not unquote filenames read with -T"), 71 },
+   N_("Do not unquote filenames read with -T"), 91 },
   {"exclude", EXCLUDE_OPTION, N_("PATTERN"), 0,
   {"exclude", EXCLUDE_OPTION, N_("PATTERN"), 0,
-   N_("exclude files, given as a PATTERN"), 71 },
+   N_("exclude files, given as a PATTERN"), 91 },
   {"exclude-from", 'X', N_("FILE"), 0,
   {"exclude-from", 'X', N_("FILE"), 0,
-   N_("exclude patterns listed in FILE"), 71 },
+   N_("exclude patterns listed in FILE"), 91 },
   {"exclude-caches", EXCLUDE_CACHES_OPTION, 0, 0,
   {"exclude-caches", EXCLUDE_CACHES_OPTION, 0, 0,
-   N_("exclude directories containing a cache tag"), 71 },
+   N_("exclude directories containing a cache tag"), 91 },
   {"ignore-case", IGNORE_CASE_OPTION, 0, 0,
   {"ignore-case", IGNORE_CASE_OPTION, 0, 0,
-   N_("exclusion ignores case"), 71 },
+   N_("exclusion ignores case"), 91 },
   {"anchored", ANCHORED_OPTION, 0, 0,
   {"anchored", ANCHORED_OPTION, 0, 0,
-   N_("exclude patterns match file name start"), 71 },
+   N_("exclude patterns match file name start"), 91 },
   {"no-anchored", NO_ANCHORED_OPTION, 0, 0,
   {"no-anchored", NO_ANCHORED_OPTION, 0, 0,
-   N_("exclude patterns match after any / (default)"), 71 },
+   N_("exclude patterns match after any / (default)"), 91 },
   {"no-ignore-case", NO_IGNORE_CASE_OPTION, 0, 0,
   {"no-ignore-case", NO_IGNORE_CASE_OPTION, 0, 0,
-   N_("exclusion is case sensitive (default)"), 71 },
+   N_("exclusion is case sensitive (default)"), 91 },
   {"no-wildcards", NO_WILDCARDS_OPTION, 0, 0,
   {"no-wildcards", NO_WILDCARDS_OPTION, 0, 0,
-   N_("exclude patterns are plain strings"), 71 },
+   N_("exclude patterns are plain strings"), 91 },
   {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
   {"no-wildcards-match-slash", NO_WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
-   N_("exclude pattern wildcards do not match '/'"), 71 },
+   N_("exclude pattern wildcards do not match '/'"), 91 },
   {"no-recursion", NO_RECURSION_OPTION, 0, 0,
   {"no-recursion", NO_RECURSION_OPTION, 0, 0,
-   N_("avoid descending automatically in directories"), 71 },
+   N_("avoid descending automatically in directories"), 91 },
   {"one-file-system", ONE_FILE_SYSTEM_OPTION, 0, 0,
   {"one-file-system", ONE_FILE_SYSTEM_OPTION, 0, 0,
-   N_("stay in local file system when creating archive"), 71 },
-  {NULL, 'l', 0, OPTION_HIDDEN, "", 71},
+   N_("stay in local file system when creating archive"), 91 },
+  {NULL, 'l', 0, OPTION_HIDDEN, "", 91},
   {"recursion", RECURSION_OPTION, 0, 0,
   {"recursion", RECURSION_OPTION, 0, 0,
-   N_("recurse into directories (default)"), 71 },
+   N_("recurse into directories (default)"), 91 },
   {"absolute-names", 'P', 0, 0,
   {"absolute-names", 'P', 0, 0,
-   N_("don't strip leading `/'s from file names"), 71 },
+   N_("don't strip leading `/'s from file names"), 91 },
   {"dereference", 'h', 0, 0,
   {"dereference", 'h', 0, 0,
-   N_("dump instead the files symlinks point to"), 71 },
+   N_("dump instead the files symlinks point to"), 91 },
   {"starting-file", 'K', N_("MEMBER-NAME"), 0,
   {"starting-file", 'K', N_("MEMBER-NAME"), 0,
-   N_("begin at member MEMBER-NAME in the archive"), 71 },
+   N_("begin at member MEMBER-NAME in the archive"), 91 },
   {"strip-components", STRIP_COMPONENTS_OPTION, N_("NUMBER"), 0,
   {"strip-components", STRIP_COMPONENTS_OPTION, N_("NUMBER"), 0,
-   N_("strip NUMBER leading components from file names"), 71 },
+   N_("strip NUMBER leading components from file names"), 91 },
   {"newer", 'N', N_("DATE-OR-FILE"), 0,
   {"newer", 'N', N_("DATE-OR-FILE"), 0,
-   N_("only store files newer than DATE-OR-FILE"), 71 },
+   N_("only store files newer than DATE-OR-FILE"), 91 },
   {"newer-mtime", NEWER_MTIME_OPTION, N_("DATE"), 0,
   {"newer-mtime", NEWER_MTIME_OPTION, N_("DATE"), 0,
-   N_("compare date and time when data changed only"), 71 },
+   N_("compare date and time when data changed only"), 91 },
   {"after-date", 'N', N_("DATE"), 0,
   {"after-date", 'N', N_("DATE"), 0,
-   N_("same as -N"), 71 },
+   N_("same as -N"), 91 },
   {"backup", BACKUP_OPTION, N_("CONTROL"), OPTION_ARG_OPTIONAL,
   {"backup", BACKUP_OPTION, N_("CONTROL"), OPTION_ARG_OPTIONAL,
-   N_("backup before removal, choose version CONTROL"), 71 },
+   N_("backup before removal, choose version CONTROL"), 91 },
   {"suffix", SUFFIX_OPTION, N_("STRING"), 0,
   {"suffix", SUFFIX_OPTION, N_("STRING"), 0,
-   N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX"), 71 },
+   N_("backup before removal, override usual suffix ('~' unless overridden by environment variable SIMPLE_BACKUP_SUFFIX"), 91 },
   {"wildcards", WILDCARDS_OPTION, 0, 0,
   {"wildcards", WILDCARDS_OPTION, 0, 0,
-   N_("exclude patterns use wildcards (default)"), 71 },
+   N_("exclude patterns use wildcards (default)"), 91 },
   {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
   {"wildcards-match-slash", WILDCARDS_MATCH_SLASH_OPTION, 0, 0,
-   N_("exclude pattern wildcards match '/' (default)"), 71 },
+   N_("exclude pattern wildcards match '/' (default)"), 91 },
 
 
   {NULL, 0, NULL, 0,
   {NULL, 0, NULL, 0,
-   N_("Informative output:"), 80 },
+   N_("Informative output:"), 100 },
   
   
   {"verbose", 'v', 0, 0,
   {"verbose", 'v', 0, 0,
-   N_("verbosely list files processed"), 81 },
+   N_("verbosely list files processed"), 101 },
   {"checkpoint", CHECKPOINT_OPTION, 0, 0,
   {"checkpoint", CHECKPOINT_OPTION, 0, 0,
-   N_("display progress messages every 10th record"), 81 },
+   N_("display progress messages every 10th record"), 101 },
   {"check-links", CHECK_LINKS_OPTION, 0, 0,
   {"check-links", CHECK_LINKS_OPTION, 0, 0,
-   N_("print a message if not all links are dumped"), 82 },
+   N_("print a message if not all links are dumped"), 102 },
   {"totals", TOTALS_OPTION, 0, 0,
   {"totals", TOTALS_OPTION, 0, 0,
-   N_("print total bytes written while creating archive"), 82 },
+   N_("print total bytes written while creating archive"), 102 },
   {"utc", UTC_OPTION, 0, 0,
   {"utc", UTC_OPTION, 0, 0,
-   N_("print file modification dates in UTC"), 82 },
+   N_("print file modification dates in UTC"), 102 },
   {"index-file", INDEX_FILE_OPTION, N_("FILE"), 0,
   {"index-file", INDEX_FILE_OPTION, N_("FILE"), 0,
-   N_("send verbose output to FILE"), 82 },
+   N_("send verbose output to FILE"), 102 },
   {"block-number", 'R', 0, 0,
   {"block-number", 'R', 0, 0,
-   N_("show block number within archive with each message"), 82 },
+   N_("show block number within archive with each message"), 102 },
   {"interactive", 'w', 0, 0,
   {"interactive", 'w', 0, 0,
-   N_("ask for confirmation for every action"), 82 },
-  {"confirmation", 0, 0, OPTION_ALIAS, NULL, 82 },
+   N_("ask for confirmation for every action"), 102 },
+  {"confirmation", 0, 0, OPTION_ALIAS, NULL, 102 },
   {"show-defaults", SHOW_DEFAULTS_OPTION, 0, 0,
   {"show-defaults", SHOW_DEFAULTS_OPTION, 0, 0,
-   N_("Show tar defaults"), 82 },
+   N_("Show tar defaults"), 102 },
   {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION, 0, 0,
   {"show-omitted-dirs", SHOW_OMITTED_DIRS_OPTION, 0, 0,
-   N_("When listing or extracting, list each directory that does not match search criteria"), 82 },
+   N_("When listing or extracting, list each directory that does not match search criteria"), 102 },
   
   
   {NULL, 0, NULL, 0,
   {NULL, 0, NULL, 0,
-   N_("Compatibility options:"), 90 },
+   N_("Compatibility options:"), 110 },
 
 
   {NULL, 'o', 0, 0,
   {NULL, 'o', 0, 0,
-   N_("when creating, same as --old-archive. When extracting, same as --no-same-owner"), 91 },
+   N_("when creating, same as --old-archive. When extracting, same as --no-same-owner"), 111 },
 
 
   {NULL, 0, NULL, 0,
   {NULL, 0, NULL, 0,
-   N_("Other options:"), 100 },
+   N_("Other options:"), 120 },
 
 
   {"help",  '?', 0, 0,  N_("Give this help list"), -1},
   {"help",  '?', 0, 0,  N_("Give this help list"), -1},
   {"usage", USAGE_OPTION, 0, 0,  N_("Give a short usage message"), -1},
   {"usage", USAGE_OPTION, 0, 0,  N_("Give a short usage message"), -1},
@@ -1762,7 +1772,13 @@ decode_options (int argc, char **argv)
     simple_backup_suffix = xstrdup (args.backup_suffix_string);
     simple_backup_suffix = xstrdup (args.backup_suffix_string);
 
 
   if (backup_option)
   if (backup_option)
-    backup_type = xget_version ("--backup", args.version_control_string);
+    {
+      backup_type = xget_version ("--backup", args.version_control_string);
+      /* No backup is needed either if explicitely disabled or if
+	 the extracted files are not being written to disk. */
+      if (backup_type == no_backups || EXTRACT_OVER_PIPE)
+	backup_option = false;
+    }
 
 
   if (verbose_option && args.textual_date_option)
   if (verbose_option && args.textual_date_option)
     {
     {