exiftool-vendored.exe 12.55.0 → 12.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/bin/exiftool_files/Changes +97 -4
  2. package/bin/exiftool_files/README +19 -19
  3. package/bin/exiftool_files/arg_files/xmp2exif.args +4 -1
  4. package/bin/exiftool_files/config_files/example.config +1 -0
  5. package/bin/exiftool_files/config_files/rotate_regions.config +1 -1
  6. package/bin/exiftool_files/exiftool.pl +198 -123
  7. package/bin/exiftool_files/fmt_files/kml.fmt +3 -0
  8. package/bin/exiftool_files/fmt_files/kml_track.fmt +3 -0
  9. package/bin/exiftool_files/lib/Image/ExifTool/AIFF.pm +2 -2
  10. package/bin/exiftool_files/lib/Image/ExifTool/APE.pm +2 -2
  11. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +25 -19
  12. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +33 -7
  13. package/bin/exiftool_files/lib/Image/ExifTool/CanonRaw.pm +5 -1
  14. package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +28 -2
  15. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +107 -20
  16. package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +92 -9
  17. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +9 -4
  18. package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +7 -2
  19. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +30 -7
  20. package/bin/exiftool_files/lib/Image/ExifTool/InfiRay.pm +227 -0
  21. package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +53 -7
  22. package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +5 -5
  23. package/bin/exiftool_files/lib/Image/ExifTool/LIF.pm +10 -2
  24. package/bin/exiftool_files/lib/Image/ExifTool/LNK.pm +5 -4
  25. package/bin/exiftool_files/lib/Image/ExifTool/MIE.pm +3 -3
  26. package/bin/exiftool_files/lib/Image/ExifTool/MPEG.pm +2 -2
  27. package/bin/exiftool_files/lib/Image/ExifTool/MakerNotes.pm +3 -2
  28. package/bin/exiftool_files/lib/Image/ExifTool/Minolta.pm +6 -7
  29. package/bin/exiftool_files/lib/Image/ExifTool/MinoltaRaw.pm +2 -1
  30. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +1199 -1325
  31. package/bin/exiftool_files/lib/Image/ExifTool/NikonCustom.pm +2 -2
  32. package/bin/exiftool_files/lib/Image/ExifTool/NikonSettings.pm +1 -1
  33. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +88 -6
  34. package/bin/exiftool_files/lib/Image/ExifTool/OpenEXR.pm +32 -15
  35. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +89 -3
  36. package/bin/exiftool_files/lib/Image/ExifTool/PanasonicRaw.pm +27 -1
  37. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +8 -5
  38. package/bin/exiftool_files/lib/Image/ExifTool/PhaseOne.pm +14 -1
  39. package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +38 -7
  40. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +44 -13
  41. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +63 -20
  42. package/bin/exiftool_files/lib/Image/ExifTool/README +19 -2
  43. package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +34 -13
  44. package/bin/exiftool_files/lib/Image/ExifTool/Rawzor.pm +2 -2
  45. package/bin/exiftool_files/lib/Image/ExifTool/Real.pm +2 -2
  46. package/bin/exiftool_files/lib/Image/ExifTool/Ricoh.pm +2 -1
  47. package/bin/exiftool_files/lib/Image/ExifTool/Sigma.pm +5 -4
  48. package/bin/exiftool_files/lib/Image/ExifTool/SigmaRaw.pm +9 -3
  49. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +28 -1
  50. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +4691 -4624
  51. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +511 -117
  52. package/bin/exiftool_files/lib/Image/ExifTool/VCard.pm +19 -5
  53. package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +5 -5
  54. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +42 -0
  55. package/bin/exiftool_files/lib/Image/ExifTool/WriteXMP.pl +1 -1
  56. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +150 -36
  57. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +19 -4
  58. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +2 -1
  59. package/bin/exiftool_files/lib/Image/ExifTool.pm +248 -54
  60. package/bin/exiftool_files/lib/Image/ExifTool.pod +94 -58
  61. package/package.json +2 -2
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '12.55';
14
+ my $version = '12.60';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  my $exePath;
@@ -69,6 +69,7 @@ sub AcceptFile($);
69
69
  sub SlurpFile($$);
70
70
  sub FilterArgfileLine($);
71
71
  sub ReadStayOpen($);
72
+ sub Progress($$);
72
73
  sub PrintTagList($@);
73
74
  sub PrintErrors($$$);
74
75
  sub Help();
@@ -95,6 +96,7 @@ my @newValues; # list of new tag values to set
95
96
  my @requestTags; # tags to request (for -p or -if option arguments)
96
97
  my @srcFmt; # source file name format strings
97
98
  my @tags; # list of tags to extract
99
+ my %altFile; # alternate files to extract information (keyed by lower-case family 8 group)
98
100
  my %appended; # list of files appended to
99
101
  my %countLink; # count hard and symbolic links made
100
102
  my %created; # list of files we created
@@ -107,6 +109,7 @@ my %outComma; # flag that output text file needs a comma
107
109
  my %outTrailer; # trailer for output text file
108
110
  my %preserveTime; # preserved timestamps for files
109
111
  my %printFmt; # the contents of the print format file
112
+ my %seqFileDir; # file sequence number in each directory
110
113
  my %setTags; # hash of list references for tags to set from files
111
114
  my %setTagsList; # list of other tag lists for multiple -tagsFromFile from the same file
112
115
  my %usedFileName; # lookup for file names we already used in TestName feature
@@ -175,7 +178,9 @@ my $pause; # pause before returning
175
178
  my $preserveTime; # flag to preserve times of updated files (2=preserve FileCreateDate only)
176
179
  my $progress; # flag to calculate total files to process (0=calculate but don't display)
177
180
  my $progressCount; # count of files processed
181
+ my $progressIncr; # increment for progress counter
178
182
  my $progressMax; # total number of files to process
183
+ my $progressNext; # next progress count to output
179
184
  my $progStr; # progress message string
180
185
  my $quiet; # flag to disable printing of informational messages / warnings
181
186
  my $rafStdin; # File::RandomAccess for stdin (if necessary to rewind)
@@ -186,7 +191,7 @@ my $saveCount; # count the number of times we will/did call SaveNewValues()
186
191
  my $scanWritable; # flag to process only writable file types
187
192
  my $sectHeader; # current section header for -p option
188
193
  my $sectTrailer; # section trailer for -p option
189
- my $seqFileBase; # sequential file number at start of directory
194
+ my $seqFileDir; # sequential file number used for %-C
190
195
  my $seqFileNum; # sequential file number used for %C
191
196
  my $setCharset; # character set setting ('default' if not set and -csv -b used)
192
197
  my $showGroup; # number of group to show (may be zero or '')
@@ -204,6 +209,7 @@ my $validFile; # flag indicating we processed a valid file
204
209
  my $verbose; # verbose setting
205
210
  my $vout; # verbose output file reference (\*STDOUT or \*STDERR)
206
211
  my $windowTitle; # title for console window
212
+ my %wroteHEAD; # list of output txt files to which we wrote HEAD
207
213
  my $xml; # flag for XML-formatted output
208
214
 
209
215
  # flag to keep the input -@ argfile open:
@@ -244,17 +250,15 @@ my %optArgs = (
244
250
  '-csvdelim' => 1,
245
251
  '-d' => 1, '-dateformat' => 1,
246
252
  '-D' => 0, # necessary to avoid matching lower-case equivalent
247
- '-echo' => 1, '-echo1' => 1, '-echo2' => 1, '-echo3' => 1, '-echo4' => 1,
248
- '-efile' => 1, '-efile1' => 1, '-efile2' => 1, '-efile3' => 1, '-efile4' => 1,
249
- '-efile!' => 1, '-efile1!' => 1, '-efile2!' => 1, '-efile3!' => 1, '-efile4!' => 1,
253
+ '-echo' => 1, '-echo#' => 1,
254
+ '-efile' => 1, '-efile#' => 1, '-efile!' => 1, '-efile#!' => 1,
250
255
  '-ext' => 1, '--ext' => 1, '-ext+' => 1, '--ext+' => 1,
251
256
  '-extension' => 1, '--extension' => 1, '-extension+' => 1, '--extension+' => 1,
252
- '-fileorder' => 1, '-fileorder0' => 1, '-fileorder1' => 1, '-fileorder2' => 1,
253
- '-fileorder3' => 1, '-fileorder4' => 1, '-fileorder5' => 1,
257
+ '-fileorder' => 1, '-fileorder#' => 1,
254
258
  '-geotag' => 1,
255
259
  '-globaltimeshift' => 1,
256
260
  '-i' => 1, '-ignore' => 1,
257
- '-if' => 1, '-if0' => 1, '-if1' => 1, '-if2' => 1, '-if3' => 1, '-if4' => 1, '-if5' => 1,
261
+ '-if' => 1, '-if#' => 1,
258
262
  '-lang' => 0, # (optional arg; cannot begin with "-")
259
263
  '-listitem' => 1,
260
264
  '-o' => 1, '-out' => 1,
@@ -462,6 +466,7 @@ undef %outComma;
462
466
  undef %outTrailer;
463
467
  undef %printFmt;
464
468
  undef %preserveTime;
469
+ undef %seqFileDir;
465
470
  undef %setTags;
466
471
  undef %setTagsList;
467
472
  undef %usedFileName;
@@ -503,7 +508,9 @@ undef $outOpt;
503
508
  undef $preserveTime;
504
509
  undef $progress;
505
510
  undef $progressCount;
511
+ undef $progressIncr;
506
512
  undef $progressMax;
513
+ undef $progressNext;
507
514
  undef $recurse;
508
515
  undef $scanWritable;
509
516
  undef $sectHeader;
@@ -546,7 +553,7 @@ $quiet = 0;
546
553
  $rtnVal = 0;
547
554
  $saveCount = 0;
548
555
  $sectTrailer = '';
549
- $seqFileBase = 0;
556
+ $seqFileDir = 0;
550
557
  $seqFileNum = 0;
551
558
  $tabFormat = 0;
552
559
  $vout = \*STDOUT;
@@ -739,7 +746,7 @@ for (;;) {
739
746
  }
740
747
  if ($verbose > 1) {
741
748
  print "Include directories:\n";
742
- print " $_\n" foreach @INC;
749
+ ref $_ or print " $_\n" foreach @INC;
743
750
  }
744
751
  } else {
745
752
  print "$version$str$Image::ExifTool::RELEASE\n";
@@ -929,12 +936,14 @@ for (;;) {
929
936
  $mt->Options(Duplicates => 1);
930
937
  next;
931
938
  }
932
- if (/^efile(\d)?(!)?$/i) {
939
+ if (/^efile(\d+)?(!)?$/i) {
933
940
  my $arg = shift;
934
941
  defined $arg or Error("Expecting file name for -$_ option\n"), $badCmd=1, next;
935
- $efile[0] = $arg if not $1 or $1 & 0x01;
936
- $efile[1] = $arg if $1 and $1 & 0x02;
937
- $efile[2] = $arg if $1 and $1 & 0x04;
942
+ $efile[0] = $arg if not $1 or $1 & 0x01;# error
943
+ $efile[1] = $arg if $1 and $1 & 0x02; # unchanged
944
+ $efile[2] = $arg if $1 and $1 & 0x04; # failed -if condition
945
+ $efile[3] = $arg if $1 and $1 & 0x08; # updated
946
+ $efile[4] = $arg if $1 and $1 & 0x016; # created
938
947
  unlink $arg if $2;
939
948
  next;
940
949
  }
@@ -960,6 +969,10 @@ for (;;) {
960
969
  $mt->Options(FastScan => (length $1 ? $1 : 1));
961
970
  next;
962
971
  }
972
+ if (/^(file\d+)$/i) {
973
+ $altFile{lc $1} = shift or Error("Expecting file name for -file option\n"), $badCmd=1, next;
974
+ next;
975
+ }
963
976
  if (/^fileorder(\d*)$/i) {
964
977
  push @fileOrder, shift if @ARGV;
965
978
  my $num = $1 || 0;
@@ -1133,9 +1146,11 @@ for (;;) {
1133
1146
  }
1134
1147
  (/^P$/ or $a eq 'preserve') and $preserveTime = 1, next;
1135
1148
  /^password$/i and $mt->Options(Password => shift), next;
1136
- if (/^progress(:.*)?$/i) {
1137
- if ($1) {
1138
- $windowTitle = substr $1, 1;
1149
+ if (/^progress(\d*)(:.*)?$/i) {
1150
+ $progressIncr = $1 || 1;
1151
+ $progressNext = 0; # start showing progress at the first file
1152
+ if ($2) {
1153
+ $windowTitle = substr $2, 1;
1139
1154
  $windowTitle = 'ExifTool %p%%' unless length $windowTitle;
1140
1155
  $windowTitle =~ /%\d*[bpr]/ and $progress = 0 unless defined $progress;
1141
1156
  } else {
@@ -1253,7 +1268,8 @@ for (;;) {
1253
1268
  next;
1254
1269
  }
1255
1270
  if (/^(w|textout|tagout)([!+]*)$/i) {
1256
- $textOut = shift || Warn("Expecting output extension for -$_ option\n");
1271
+ # (note: all logic ignores $textOut of 0 or '')
1272
+ $textOut = shift || Warn("Expecting argument for -$_ option\n");
1257
1273
  my ($t1, $t2) = ($1, $2);
1258
1274
  $textOverwrite = 0;
1259
1275
  $textOverwrite += 1 if $t2 =~ /!/; # overwrite
@@ -1337,7 +1353,7 @@ for (;;) {
1337
1353
  AddSetTagsFile($setTagsFile = '@') if not $setTagsFile and /(<|>)/;
1338
1354
  if ($setTagsFile) {
1339
1355
  push @{$setTags{$setTagsFile}}, $_;
1340
- if (/>/) {
1356
+ if ($1 eq '>') {
1341
1357
  $useMWG = 1 if /^(.*>\s*)?mwg:/si;
1342
1358
  if (/\b(filename|directory|testname)#?$/i) {
1343
1359
  $doSetFileName = 1;
@@ -1709,7 +1725,7 @@ if (defined $showGroup and not (@tags and $allGroup) and ($sortOpt or not define
1709
1725
  $mt->Options(Sort => "Group$showGroup");
1710
1726
  }
1711
1727
 
1712
- if (defined $textOut) {
1728
+ if ($textOut) {
1713
1729
  CleanFilename($textOut); # make all forward slashes
1714
1730
  # add '.' before output extension if necessary
1715
1731
  $textOut = ".$textOut" unless $textOut =~ /[.%]/ or defined $tagOut;
@@ -1930,10 +1946,10 @@ Exit $rtnValApp; # all done
1930
1946
  sub GetImageInfo($$)
1931
1947
  {
1932
1948
  my ($et, $orig) = @_;
1933
- my (@foundTags, $info, $file, $ind);
1949
+ my (@foundTags, $info, $file, $ind, $g8);
1934
1950
 
1935
1951
  # set window title for this file if necessary
1936
- if (defined $windowTitle) {
1952
+ if (defined $windowTitle and $progressCount >= $progressNext) {
1937
1953
  my $prog = $progressMax ? "$progressCount/$progressMax" : '0/0';
1938
1954
  my $title = $windowTitle;
1939
1955
  my ($num, $denom) = split '/', $prog;
@@ -1949,6 +1965,7 @@ sub GetImageInfo($$)
1949
1965
  );
1950
1966
  $title =~ s/%([%bfpr])/$lkup{$1}/eg;
1951
1967
  SetWindowTitle($title);
1968
+ undef $progressNext;
1952
1969
  }
1953
1970
  unless (length $orig or $outOpt) {
1954
1971
  Warn qq(Error: Zero-length file name - ""\n);
@@ -1972,6 +1989,11 @@ sub GetImageInfo($$)
1972
1989
  } else {
1973
1990
  $file = $orig;
1974
1991
  }
1992
+ # set alternate file names
1993
+ foreach $g8 (sort keys %altFile) {
1994
+ my $altName = FilenameSPrintf($altFile{$g8}, $orig);
1995
+ $et->SetAlternateFile($g8, $altName);
1996
+ }
1975
1997
 
1976
1998
  my $pipe = $file;
1977
1999
  if ($doUnzip) {
@@ -2042,7 +2064,7 @@ sub GetImageInfo($$)
2042
2064
  undef @foundTags if $fastCondition; # ignore if we didn't get all tags
2043
2065
  }
2044
2066
  unless ($result) {
2045
- $verbose and print $vout "-------- $file (failed condition)$progStr\n";
2067
+ Progress($vout, "-------- $file (failed condition)") if $verbose;
2046
2068
  EFile($file, 2);
2047
2069
  ++$countFailed;
2048
2070
  return;
@@ -2052,7 +2074,7 @@ sub GetImageInfo($$)
2052
2074
  undef $info if $verbose or defined $fastCondition;
2053
2075
  }
2054
2076
  if (defined $deleteOrig) {
2055
- print $vout "======== $file$progStr\n" if defined $verbose;
2077
+ Progress($vout, "======== $file") if defined $verbose;
2056
2078
  ++$count;
2057
2079
  my $original = "${file}_original";
2058
2080
  $et->Exists($original) or return;
@@ -2061,6 +2083,7 @@ sub GetImageInfo($$)
2061
2083
  push @delFiles, $original;
2062
2084
  } elsif ($et->Rename($original, $file)) {
2063
2085
  $verbose and print $vout "Restored from $original\n";
2086
+ EFile($file, 3);
2064
2087
  ++$countGoodWr;
2065
2088
  } else {
2066
2089
  Warn "Error renaming $original\n";
@@ -2070,6 +2093,8 @@ sub GetImageInfo($$)
2070
2093
  return;
2071
2094
  }
2072
2095
  ++$seqFileNum; # increment our file counter
2096
+ my ($dir) = Image::ExifTool::SplitFileName($orig);
2097
+ $seqFileDir = $seqFileDir{$dir} = ($seqFileDir{$dir} || 0) + 1;
2073
2098
 
2074
2099
  my $lineCount = 0;
2075
2100
  my ($fp, $outfile, $append);
@@ -2082,12 +2107,12 @@ sub GetImageInfo($$)
2082
2107
  }
2083
2108
 
2084
2109
  if ($isWriting) {
2085
- print $vout "======== $file$progStr\n" if defined $verbose;
2110
+ Progress($vout, "======== $file") if defined $verbose;
2086
2111
  SetImageInfo($et, $file, $orig);
2087
2112
  $info = $et->GetInfo('Warning', 'Error');
2088
2113
  PrintErrors($et, $info, $file);
2089
2114
  # close output text file if necessary
2090
- if ($outfile) {
2115
+ if (defined $outfile) {
2091
2116
  undef $tmpText;
2092
2117
  close($fp);
2093
2118
  $et->Options(TextOut => $vout);
@@ -2106,7 +2131,7 @@ sub GetImageInfo($$)
2106
2131
  unless ($file eq '-' or $et->Exists($file)) {
2107
2132
  Warn "Error: File not found - $file\n";
2108
2133
  FileNotFound($file);
2109
- $outfile and close($fp), undef($tmpText), $et->Unlink($outfile);
2134
+ defined $outfile and close($fp), undef($tmpText), $et->Unlink($outfile);
2110
2135
  EFile($file);
2111
2136
  ++$countBad;
2112
2137
  return;
@@ -2123,7 +2148,7 @@ sub GetImageInfo($$)
2123
2148
  }
2124
2149
  }
2125
2150
  $o = \*STDERR if $progress and not $o;
2126
- $o and print $o "======== $file$progStr\n";
2151
+ Progress($o, "======== $file") if $o;
2127
2152
  if ($info) {
2128
2153
  # get the information we wanted
2129
2154
  if (@tags and not %printFmt) {
@@ -2145,7 +2170,7 @@ sub GetImageInfo($$)
2145
2170
  }
2146
2171
  # all done now if we already wrote output text file (eg. verbose option)
2147
2172
  if ($fp) {
2148
- if ($outfile) {
2173
+ if (defined $outfile) {
2149
2174
  $et->Options(TextOut => \*STDOUT);
2150
2175
  undef $tmpText;
2151
2176
  if ($info->{Error}) {
@@ -2174,7 +2199,7 @@ sub GetImageInfo($$)
2174
2199
  }
2175
2200
 
2176
2201
  # open output file (or stdout if no output file) if not done already
2177
- unless ($outfile or $tagOut) {
2202
+ unless (defined $outfile or $tagOut) {
2178
2203
  ($fp, $outfile, $append) = OpenOutputFile($orig);
2179
2204
  $fp or EFile($file), ++$countBad, return;
2180
2205
  $tmpText = $outfile unless $append;
@@ -2199,6 +2224,10 @@ sub GetImageInfo($$)
2199
2224
  my $skipBody;
2200
2225
  foreach $type (qw(HEAD SECT IF BODY ENDS TAIL)) {
2201
2226
  my $prf = $printFmt{$type} or next;
2227
+ if ($type eq 'HEAD' and defined $outfile) {
2228
+ next if $wroteHEAD{$outfile};
2229
+ $wroteHEAD{$outfile} = 1;
2230
+ }
2202
2231
  next if $type eq 'BODY' and $skipBody;
2203
2232
  if ($lastDoc) {
2204
2233
  if ($doc) {
@@ -2236,7 +2265,7 @@ sub GetImageInfo($$)
2236
2265
  }
2237
2266
  }
2238
2267
  }
2239
- delete $printFmt{HEAD} unless $outfile; # print header only once per output file
2268
+ delete $printFmt{HEAD} unless defined $outfile; # print header only once per output file
2240
2269
  my $errs = $et->GetInfo('Warning', 'Error');
2241
2270
  PrintErrors($et, $errs, $file) and EFile($file);
2242
2271
  } elsif (not $disableOutput) {
@@ -2392,7 +2421,7 @@ TAG: foreach $tag (@foundTags) {
2392
2421
  next TAG;
2393
2422
  }
2394
2423
  my @groups = $et->GetGroup($tag);
2395
- $outfile and close($fp), undef($tmpText); # (shouldn't happen)
2424
+ defined $outfile and close($fp), undef($tmpText); # (shouldn't happen)
2396
2425
  my $org = $et->GetValue('OriginalRawFileName') || $et->GetValue('OriginalFileName');
2397
2426
  ($fp, $outfile, $append) = OpenOutputFile($orig, $tagName, \@groups, $ext, $org);
2398
2427
  $fp or ++$countBad, next TAG;
@@ -2698,7 +2727,7 @@ TAG: foreach $tag (@foundTags) {
2698
2727
  }
2699
2728
  }
2700
2729
  }
2701
- if ($outfile) {
2730
+ if (defined $outfile) {
2702
2731
  if ($textOverwrite & 0x02) {
2703
2732
  # save state of this file if we may be appending
2704
2733
  $outComma{$outfile} = $comma;
@@ -3014,6 +3043,7 @@ sub SetImageInfo($$$)
3014
3043
  $r3 = $et->SetSystemTags($file);
3015
3044
  }
3016
3045
  if ($r0 > 0 or $r1 > 0 or $r2 > 0 or $r3 > 0) {
3046
+ EFile($infile, 3);
3017
3047
  ++$countGoodWr;
3018
3048
  } elsif ($r0 < 0 or $r1 < 0 or $r2 < 0 or $r3 < 0) {
3019
3049
  EFile($infile);
@@ -3128,6 +3158,7 @@ sub SetImageInfo($$$)
3128
3158
  $preserveTime{$file} = [ $aTime, $mTime, $cTime ];
3129
3159
  }
3130
3160
  }
3161
+ EFile($infile, 3);
3131
3162
  ++$countGoodWr;
3132
3163
  } else {
3133
3164
  close(NEW_FILE);
@@ -3143,6 +3174,7 @@ sub SetImageInfo($$$)
3143
3174
  # simply rename temporary file to replace original
3144
3175
  # (if we didn't already rename it to add "_original")
3145
3176
  } elsif ($et->Rename($tmpFile, $dstFile)) {
3177
+ EFile($infile, 3);
3146
3178
  ++$countGoodWr;
3147
3179
  } else {
3148
3180
  my $newFile = $tmpFile;
@@ -3160,21 +3192,26 @@ sub SetImageInfo($$$)
3160
3192
  # (don't delete tmp file now because it is all we have left)
3161
3193
  ++$countBadWr;
3162
3194
  } else {
3195
+ EFile($infile, 3);
3163
3196
  ++$countGoodWr;
3164
3197
  }
3165
3198
  }
3166
3199
  } elsif ($overwriteOrig) {
3167
3200
  # erase original file
3201
+ EFile($infile, 3);
3168
3202
  $et->Unlink($file) or Warn "Error erasing original $file\n";
3169
3203
  ++$countGoodWr;
3170
3204
  } else {
3205
+ EFile($infile, 4);
3171
3206
  ++$countGoodCr;
3172
3207
  }
3173
3208
  } else {
3174
3209
  # this file was created from scratch, not edited
3210
+ EFile($infile, 4);
3175
3211
  ++$countGoodCr;
3176
3212
  }
3177
3213
  } else {
3214
+ EFile($infile, 3);
3178
3215
  ++$countGoodWr;
3179
3216
  }
3180
3217
  } elsif ($success) {
@@ -3659,8 +3696,19 @@ sub ProcessFiles($;$)
3659
3696
  foreach $file (@files) {
3660
3697
  $et->Options(CharsetFileName => 'UTF8') if $utf8FileName{$file};
3661
3698
  if (defined $progressMax) {
3699
+ unless (defined $progressNext) {
3700
+ $progressNext = $progressCount + $progressIncr;
3701
+ $progressNext -= $progressNext % $progressIncr;
3702
+ $progressNext = $progressMax if $progressNext > $progressMax;
3703
+ }
3662
3704
  ++$progressCount;
3663
- $progStr = " [$progressCount/$progressMax]" if $progress;
3705
+ if ($progress) {
3706
+ if ($progressCount >= $progressNext) {
3707
+ $progStr = " [$progressCount/$progressMax]";
3708
+ } else {
3709
+ undef $progStr; # don't update progress yet
3710
+ }
3711
+ }
3664
3712
  }
3665
3713
  if ($et->IsDirectory($file) and not $listDir) {
3666
3714
  $multiFile = $validFile = 1;
@@ -3668,7 +3716,7 @@ sub ProcessFiles($;$)
3668
3716
  } elsif ($filterFlag and not AcceptFile($file)) {
3669
3717
  if ($et->Exists($file)) {
3670
3718
  $filtered = 1;
3671
- $verbose and print $vout "-------- $file (wrong extension)$progStr\n";
3719
+ Progress($vout, "-------- $file (wrong extension)") if $verbose;
3672
3720
  } else {
3673
3721
  Warn "Error: File not found - $file\n";
3674
3722
  FileNotFound($file);
@@ -3716,8 +3764,6 @@ sub ScanDir($$;$)
3716
3764
  $utf8Name = 1;
3717
3765
  }
3718
3766
  return if $ignore{$dir};
3719
- my $oldBase = $seqFileBase;
3720
- $seqFileBase = $seqFileNum;
3721
3767
  # use Win32::FindFile on Windows if available
3722
3768
  # (ReadDir will croak if there is a wildcard, so check for this)
3723
3769
  if ($^O eq 'MSWin32' and $dir !~ /[*?]/) {
@@ -3749,7 +3795,6 @@ sub ScanDir($$;$)
3749
3795
  # use standard perl library routines to read directory
3750
3796
  unless (opendir(DIR_HANDLE, $dir)) {
3751
3797
  Warn("Error opening directory $dir\n");
3752
- $seqFileBase = $oldBase + ($seqFileNum - $seqFileBase);
3753
3798
  return;
3754
3799
  }
3755
3800
  @fileList = readdir(DIR_HANDLE);
@@ -3829,8 +3874,6 @@ sub ScanDir($$;$)
3829
3874
  }
3830
3875
  ++$countDir;
3831
3876
  $et->Options(CharsetFileName => $enc); # restore original setting
3832
- # update sequential file base for parent directory
3833
- $seqFileBase = $oldBase + ($seqFileNum - $seqFileBase);
3834
3877
  }
3835
3878
 
3836
3879
  #------------------------------------------------------------------------------
@@ -4126,16 +4169,15 @@ sub NextUnusedFilename($;$)
4126
4169
  return $fmt unless $fmt =~ /%[-+]?\d*\.?\d*[lun]?[cC]/;
4127
4170
  my %sep = ( '-' => '-', '+' => '_' );
4128
4171
  my ($copy, $alpha) = (0, 'a');
4129
- my $seq = $seqFileNum - 1;
4130
4172
  for (;;) {
4131
4173
  my ($filename, $pos) = ('', 0);
4132
4174
  while ($fmt =~ /(%([-+]?)(\d*)(\.?)(\d*)([lun]?)([cC]))/g) {
4133
4175
  $filename .= substr($fmt, $pos, pos($fmt) - $pos - length($1));
4134
4176
  $pos = pos($fmt);
4135
4177
  my ($sign, $wid, $dec, $wid2, $mod, $tok) = ($2, $3 || 0, $4, $5 || 0, $6, $7);
4136
- my $diff;
4178
+ my $seq;
4137
4179
  if ($tok eq 'C') {
4138
- $diff = $wid - ($sign eq '-' ? $seqFileBase : 0);
4180
+ $seq = $wid + ($sign eq '-' ? $seqFileDir : $seqFileNum) - 1;
4139
4181
  $wid = $wid2;
4140
4182
  } else {
4141
4183
  next unless $dec or $copy;
@@ -4144,13 +4186,13 @@ sub NextUnusedFilename($;$)
4144
4186
  $filename .= $sep{$sign} if $sign;
4145
4187
  }
4146
4188
  if ($mod and $mod ne 'n') {
4147
- my $a = $tok eq 'C' ? Num2Alpha($diff + $seq) : $alpha;
4189
+ my $a = $tok eq 'C' ? Num2Alpha($seq) : $alpha;
4148
4190
  my $str = ($wid and $wid > length $a) ? 'a' x ($wid - length($a)) : '';
4149
4191
  $str .= $a;
4150
4192
  $str = uc $str if $mod eq 'u';
4151
4193
  $filename .= $str;
4152
4194
  } else {
4153
- my $c = $tok eq 'C' ? ($diff + $seq) : $copy;
4195
+ my $c = $tok eq 'C' ? $seq : $copy;
4154
4196
  my $num = $c + ($mod ? 1 : 0);
4155
4197
  $filename .= $wid ? sprintf("%.${wid}d",$num) : $num;
4156
4198
  }
@@ -4165,7 +4207,6 @@ sub NextUnusedFilename($;$)
4165
4207
  }
4166
4208
  ++$copy;
4167
4209
  ++$alpha;
4168
- ++$seq;
4169
4210
  }
4170
4211
  }
4171
4212
 
@@ -4371,9 +4412,13 @@ sub ReadStayOpen($)
4371
4412
  undef $optArgs;
4372
4413
  next unless $lastOpt eq '-stay_open' or $lastOpt eq '-@';
4373
4414
  } else {
4374
- $optArgs = $optArgs{$arg};
4375
4415
  $lastOpt = lc $arg;
4376
- $optArgs = $optArgs{$lastOpt} unless defined $optArgs;
4416
+ $optArgs = $optArgs{$arg};
4417
+ unless (defined $optArgs) {
4418
+ $optArgs = $optArgs{$lastOpt};
4419
+ # handle options with trailing numbers
4420
+ $optArgs = $optArgs{"$1#$2"} if not defined $optArgs and $lastOpt =~ /^(.*?)\d+(!?)$/;
4421
+ }
4377
4422
  next unless $lastOpt =~ /^-execute\d*$/;
4378
4423
  }
4379
4424
  $processArgs = 1;
@@ -4403,7 +4448,7 @@ sub ReadStayOpen($)
4403
4448
 
4404
4449
  #------------------------------------------------------------------------------
4405
4450
  # Add new entry to -efile output file
4406
- # Inputs: 0) file name, 1) -efile option number (0=error, 1=same, 2=failed)
4451
+ # Inputs: 0) file name, 1) -efile option number (0=error, 1=same, 2=failed, 3=updated, 4=created)
4407
4452
  sub EFile($$)
4408
4453
  {
4409
4454
  my $entry = shift;
@@ -4424,6 +4469,18 @@ sub EFile($$)
4424
4469
  }
4425
4470
  }
4426
4471
 
4472
+ #------------------------------------------------------------------------------
4473
+ # Print progress message if it is time for it
4474
+ # Inputs: 0) file ref, 1) message
4475
+ sub Progress($$)
4476
+ {
4477
+ my ($file, $msg) = @_;
4478
+ if (defined $progStr) {
4479
+ print $file $msg, $progStr, "\n";
4480
+ undef $progressNext;
4481
+ }
4482
+ }
4483
+
4427
4484
  #------------------------------------------------------------------------------
4428
4485
  # Print list of tags
4429
4486
  # Inputs: 0) message, 1-N) list of tag names
@@ -4567,23 +4624,23 @@ DESCRIPTION
4567
4624
  CHM r | FPF r | MKA r | PFA r | TTF r
4568
4625
  COS r | FPX r | MKS r | PFB r | TXT r
4569
4626
  CR2 r/w | GIF r/w | MKV r | PFM r | VCF r
4570
- CR3 r/w | GPR r/w | MNG r/w | PGF r | VRD r/w/c
4571
- CRM r/w | GZ r | MOBI r | PGM r/w | VSD r
4572
- CRW r/w | HDP r/w | MODD r | PLIST r | WAV r
4573
- CS1 r/w | HDR r | MOI r | PICT r | WDP r/w
4574
- CSV r | HEIC r/w | MOS r/w | PMP r | WEBP r/w
4575
- CUR r | HEIF r/w | MOV r/w | PNG r/w | WEBM r
4576
- CZI r | HTML r | MP3 r | PPM r/w | WMA r
4577
- DCM r | ICC r/w/c | MP4 r/w | PPT r | WMV r
4578
- DCP r/w | ICO r | MPC r | PPTX r | WTV r
4579
- DCR r | ICS r | MPG r | PS r/w | WV r
4580
- DFONT r | IDML r | MPO r/w | PSB r/w | X3F r/w
4581
- DIVX r | IIQ r/w | MQV r/w | PSD r/w | XCF r
4582
- DJVU r | IND r/w | MRC r | PSP r | XLS r
4583
- DLL r | INSP r/w | MRW r/w | QTIF r/w | XLSX r
4584
- DNG r/w | INSV r | MXF r | R3D r | XMP r/w/c
4585
- DOC r | INX r | NEF r/w | RA r | ZIP r
4586
- DOCX r | ISO r | NKSC r/w | RAF r/w |
4627
+ CR3 r/w | GPR r/w | MNG r/w | PGF r | VNT r
4628
+ CRM r/w | GZ r | MOBI r | PGM r/w | VRD r/w/c
4629
+ CRW r/w | HDP r/w | MODD r | PLIST r | VSD r
4630
+ CS1 r/w | HDR r | MOI r | PICT r | WAV r
4631
+ CSV r | HEIC r/w | MOS r/w | PMP r | WDP r/w
4632
+ CUR r | HEIF r/w | MOV r/w | PNG r/w | WEBP r/w
4633
+ CZI r | HTML r | MP3 r | PPM r/w | WEBM r
4634
+ DCM r | ICC r/w/c | MP4 r/w | PPT r | WMA r
4635
+ DCP r/w | ICO r | MPC r | PPTX r | WMV r
4636
+ DCR r | ICS r | MPG r | PS r/w | WTV r
4637
+ DFONT r | IDML r | MPO r/w | PSB r/w | WV r
4638
+ DIVX r | IIQ r/w | MQV r/w | PSD r/w | X3F r/w
4639
+ DJVU r | IND r/w | MRC r | PSP r | XCF r
4640
+ DLL r | INSP r/w | MRW r/w | QTIF r/w | XLS r
4641
+ DNG r/w | INSV r | MXF r | R3D r | XLSX r
4642
+ DOC r | INX r | NEF r/w | RA r | XMP r/w/c
4643
+ DOCX r | ISO r | NKSC r/w | RAF r/w | ZIP r
4587
4644
 
4588
4645
  Meta Information
4589
4646
  ----------------------+----------------------+---------------------
@@ -4680,7 +4737,7 @@ OPTIONS
4680
4737
  -overwrite_original_in_place Overwrite original by copying tmp file
4681
4738
  -P (-preserve) Preserve file modification date/time
4682
4739
  -password PASSWD Password for processing protected files
4683
- -progress[:[TITLE]] Show file progress count
4740
+ -progress[NUM][:[TITLE]] Show file progress count
4684
4741
  -q (-quiet) Quiet processing
4685
4742
  -r[.] (-recurse) Recursively process subdirectories
4686
4743
  -scanForXMP Brute force XMP scan
@@ -4716,6 +4773,7 @@ OPTIONS
4716
4773
  -echo[NUM] TEXT Echo text to stdout or stderr
4717
4774
  -efile[NUM][!] ERRFILE Save names of files with errors
4718
4775
  -execute[NUM] Execute multiple commands on one line
4776
+ -fileNUM ALTFILE Load tags from alternate file
4719
4777
  -list_dir List directories, not their contents
4720
4778
  -srcfile FMT Process a different source file
4721
4779
  -stay_open FLAG Keep reading -@ argfile even after EOF
@@ -4731,8 +4789,10 @@ OPTIONS
4731
4789
  A tag name may include leading group names separated by colons (eg.
4732
4790
  "-EXIF:CreateDate", or "-Doc1:XMP:Creator"), and each group name
4733
4791
  may be prefixed by a digit to specify family number (eg.
4734
- "-1IPTC:City"). Use the -listg option to list available group names
4735
- by family.
4792
+ "-1IPTC:City"). (Note that the API SavePath and SaveFormat options
4793
+ must be used for the family 5 and 6 groups respectively to be
4794
+ available.) Use the -listg option to list available group names by
4795
+ family.
4736
4796
 
4737
4797
  A special tag name of "All" may be used to indicate all meta
4738
4798
  information (ie. -All). This is particularly useful when a group
@@ -4829,6 +4889,9 @@ OPTIONS
4829
4889
  - Deleting EXIF only removes ExifIFD which also deletes
4830
4890
  InteropIFD and MakerNotes.
4831
4891
 
4892
+ MOV/MP4 Video:
4893
+ - Deleting ItemList also deletes Keys tags.
4894
+
4832
4895
  Notes:
4833
4896
 
4834
4897
  1) Many tag values may be assigned in a single command. If two
@@ -4932,7 +4995,9 @@ OPTIONS
4932
4995
  may be prefixed by a group name and/or suffixed by "#". Wildcards
4933
4996
  are allowed in both the source and destination tag names. A
4934
4997
  destination group and/or tag name of "All" or "*" writes to the
4935
- same family 1 group and/or tag name as the source. If no
4998
+ same family 1 group and/or tag name as the source (but the family
4999
+ may be specified by adding a leading number to the group name, eg.
5000
+ "0All" writes to the same family 0 group as the source). If no
4936
5001
  destination group is specified, the information is written to the
4937
5002
  preferred group. Whitespace around the ">" or "<" is ignored. As a
4938
5003
  convenience, "-tagsFromFile @" is assumed for any redirected tags
@@ -4993,17 +5058,14 @@ OPTIONS
4993
5058
  operations. While this avoids duplicate list items when copying
4994
5059
  groups of tags from a file containing redundant information, it
4995
5060
  also prevents values of different tags from being copied into the
4996
- same list when this is the intent. So a -addTagsFromFile option is
4997
- provided which allows copying of multiple tags into the same list.
4998
- eg)
5061
+ same list when this is the intent. To accumulate values from
5062
+ different operations into the same list, add a "+" after the
5063
+ initial "-" of the argument. For example:
4999
5064
 
5000
- exiftool -addtagsfromfile @ "-subject<make" "-subject<model" ...
5065
+ exiftool -tagsfromfile @ '-subject<make' '-+subject<model' ...
5001
5066
 
5002
- Similarly, -addTagsFromFile must be used when conditionally
5003
- replacing a tag to prevent overriding earlier conditions.
5004
-
5005
- Other than these differences, the -tagsFromFile and
5006
- -addTagsFromFile options are equivalent.
5067
+ Similarly, "-+DSTTAG" must be used when conditionally replacing a
5068
+ tag to prevent overriding earlier conditions.
5007
5069
 
5008
5070
  6) The -a option (allow duplicate tags) is always in effect when
5009
5071
  copying tags from *SRCFILE*, but the highest priority tag is always
@@ -5230,10 +5292,10 @@ OPTIONS
5230
5292
  input files to be buffered in memory before the output is written.
5231
5293
  This may result in excessive memory usage when processing a very
5232
5294
  large number of files with a single command. Also, it makes this
5233
- option incompatible with the -w option. When processing a large
5234
- number of files, it is recommended to either use the JSON (-j) or
5235
- XML (-X) output format, or use -p to generate a fixed-column CSV
5236
- file instead of using the -csv option.
5295
+ option incompatible with the -w and -W options. When processing a
5296
+ large number of files, it is recommended to either use the JSON
5297
+ (-j) or XML (-X) output format, or use -p to generate a
5298
+ fixed-column CSV file instead of using the -csv option.
5237
5299
 
5238
5300
  -csvDelim *STR*
5239
5301
  Set the delimiter for separating CSV entries for CSV file
@@ -5270,29 +5332,29 @@ OPTIONS
5270
5332
  are escaped. The inverse conversion is applied when writing tags.
5271
5333
 
5272
5334
  -f (-forcePrint)
5273
- Force printing of tags even if their values are not found. This
5274
- option only applies when specific tags are requested on the command
5275
- line (ie. not with wildcards or by "-all"). With this option, a
5276
- dash ("-") is printed for the value of any missing tag, but the
5277
- dash may be changed via the API MissingTagValue option. May also be
5278
- used to add a 'flags' attribute to the -listx output, or to allow
5279
- tags to be deleted when writing with the -csv=*CSVFILE* feature.
5335
+ Force printing of tags even if they don't exist. This option
5336
+ applies to tags specified on the command line, or with the -p, -if
5337
+ or -tagsFromFile options. When -f is used, the value of any missing
5338
+ tag is set to a dash ("-") by default, but this may be configured
5339
+ via the API MissingTagValue option. -f is also used to add a
5340
+ 'flags' attribute to the -listx output, or to allow tags to be
5341
+ deleted when writing with the -csv=*CSVFILE* feature.
5280
5342
 
5281
5343
  -g[*NUM*][:*NUM*...] (-groupHeadings)
5282
5344
  Organize output by tag group. *NUM* specifies a group family
5283
5345
  number, and may be 0 (general location), 1 (specific location), 2
5284
5346
  (category), 3 (document number), 4 (instance number), 5 (metadata
5285
- path), 6 (EXIF/TIFF format) or 7 (tag ID). -g0 is assumed if a
5286
- family number is not specified. May be combined with other options
5287
- to add group names to the output. Multiple families may be
5288
- specified by separating them with colons. By default the resulting
5289
- group name is simplified by removing any leading "Main:" and
5290
- collapsing adjacent identical group names, but this can be avoided
5291
- by placing a colon before the first family number (eg. -g:3:1). Use
5292
- the -listg option to list group names for a specified family. The
5293
- API SavePath and SaveFormat options are automatically enabled if
5294
- the respective family 5 or 6 group names are requested. See the API
5295
- GetGroup documentation for more information.
5347
+ path), 6 (EXIF/TIFF format), 7 (tag ID) or 8 (file number). -g0 is
5348
+ assumed if a family number is not specified. May be combined with
5349
+ other options to add group names to the output. Multiple families
5350
+ may be specified by separating them with colons. By default the
5351
+ resulting group name is simplified by removing any leading "Main:"
5352
+ and collapsing adjacent identical group names, but this can be
5353
+ avoided by placing a colon before the first family number (eg.
5354
+ -g:3:1). Use the -listg option to list group names for a specified
5355
+ family. The API SavePath and SaveFormat options are automatically
5356
+ enabled if the respective family 5 or 6 group names are requested.
5357
+ See the API GetGroup documentation for more information.
5296
5358
 
5297
5359
  -G[*NUM*][:*NUM*...] (-groupNames)
5298
5360
  Same as -g but print group name for each tag. -G0 is assumed if
@@ -5472,8 +5534,10 @@ OPTIONS
5472
5534
  file. Tag names in the format file or string begin with a "$"
5473
5535
  symbol and may contain leading group names and/or a trailing "#"
5474
5536
  (to disable print conversion). Case is not significant. Braces "{}"
5475
- may be used around the tag name to separate it from subsequent
5476
- text. Use $$ to represent a "$" symbol, and $/ for a newline.
5537
+ may be used around the tag name to separate it from subsequent text
5538
+ (and must be used if subsequent text begins with an alphanumeric
5539
+ character, hyphen, underline, colon or number sign). Use $$ to
5540
+ represent a "$" symbol, and $/ for a newline.
5477
5541
 
5478
5542
  Multiple -p options may be used, each contributing a line (or more)
5479
5543
  of text to the output. Lines beginning with "#[HEAD]" and "#[TAIL]"
@@ -5501,7 +5565,7 @@ OPTIONS
5501
5565
 
5502
5566
  produces output like this:
5503
5567
 
5504
- -- Generated by ExifTool 12.55 --
5568
+ -- Generated by ExifTool 12.60 --
5505
5569
  File: a.jpg - 2003:10:31 15:44:19
5506
5570
  (f/5.6, 1/60s, ISO 100)
5507
5571
  File: b.jpg - 2006:05:23 11:57:38
@@ -6011,8 +6075,8 @@ OPTIONS
6011
6075
  return value of 1. Case is significant for function names.
6012
6076
 
6013
6077
  End() - end processing after this file
6014
- EndDir() - end processing of files in this directory (not
6015
- compatible with the B<-fileOrder> option)
6078
+ EndDir() - end processing of files in the current directory
6079
+ after this file (not compatible with -fileOrder)
6016
6080
 
6017
6081
  Notes:
6018
6082
 
@@ -6144,7 +6208,7 @@ OPTIONS
6144
6208
  issued and the document is not processed. This option is ignored if
6145
6209
  a password is not required.
6146
6210
 
6147
- -progress[:[*TITLE*]]
6211
+ -progress[NUM][:[*TITLE*]]
6148
6212
  Show the progress when processing files. Without a colon, the
6149
6213
  -progress option adds a progress count in brackets after the name
6150
6214
  of each processed file, giving the current file number and the
@@ -6152,18 +6216,20 @@ OPTIONS
6152
6216
  causing the names of processed files to also be printed when
6153
6217
  writing. When combined with the -if option, the total count
6154
6218
  includes all files before the condition is applied, but files that
6155
- fail the condition will not have their names printed.
6219
+ fail the condition will not have their names printed. If NUM is
6220
+ specified, the progress is shown every NUM input files.
6156
6221
 
6157
6222
  If followed by a colon (ie. -progress:), the console window title
6158
6223
  is set according to the specified *TITLE* string. If no *TITLE* is
6159
6224
  given, a default *TITLE* string of "ExifTool %p%%" is assumed. In
6160
6225
  the string, %f represents the file name, %p is the progress as a
6161
6226
  percent, %r is the progress as a ratio, %##b is a progress bar of
6162
- width "##" (20 characters if "##" is omitted), and %% is a %
6163
- character. May be combined with the normal -progress option to also
6164
- show the progress count in console messages. (Note: For this
6165
- feature to function correctly on Mac/Linux, stderr must go to the
6166
- console.)
6227
+ width "##" (where "##" is an integer specifying the bar width in
6228
+ characters, or 20 characters by default if "##" is omitted), and %%
6229
+ is a % character. May be combined with the normal -progress option
6230
+ to also show the progress count in console messages. (Note: For
6231
+ this feature to function correctly on Mac/Linux, stderr must go to
6232
+ the console.)
6167
6233
 
6168
6234
  -q (-quiet)
6169
6235
  Quiet processing. One -q suppresses normal informational messages,
@@ -6387,10 +6453,10 @@ OPTIONS
6387
6453
  module is the only plug-in module distributed with exiftool. This
6388
6454
  module adds read/write support for tags as recommended by the
6389
6455
  Metadata Working Group. As a convenience, "-use MWG" is assumed if
6390
- the "MWG" group is specified for any tag on the command line. See
6391
- the MWG Tags documentation for more details. Note that this option
6392
- is not reversible, and remains in effect until the application
6393
- terminates, even across the -execute option.
6456
+ the group name prefix starts with "MWG:" exactly for any requested
6457
+ tag. See the MWG Tags documentation for more details. Note that
6458
+ this option is not reversible, and remains in effect until the
6459
+ application terminates, even across the -execute option.
6394
6460
 
6395
6461
  Utilities
6396
6462
  -restore_original
@@ -6462,12 +6528,13 @@ OPTIONS
6462
6528
  -efile[*NUM*][!] *ERRFILE*
6463
6529
  Save the names of files giving errors (*NUM* missing or 1), files
6464
6530
  that were unchanged (*NUM* is 2), files that fail the -if condition
6465
- (*NUM* is 4), or any combination thereof by summing *NUM* (eg.
6466
- -efile3 is the same has having both -efile and -efile2 options with
6467
- the same *ERRFILE*). By default, file names are appended to any
6468
- existing *ERRFILE*, but *ERRFILE* is overwritten if an exclamation
6469
- point is added to the option (eg. -efile!). Saves the name of the
6470
- file specified by the -srcfile option if applicable.
6531
+ (*NUM* is 4), files that were updated (*NUM* is 8), files that were
6532
+ created (*NUM* is 16), or any combination thereof by summing *NUM*
6533
+ (eg. -efile3 is the same has having both -efile and -efile2 options
6534
+ with the same *ERRFILE*). By default, file names are appended to
6535
+ any existing *ERRFILE*, but *ERRFILE* is overwritten if an
6536
+ exclamation point is added to the option (eg. -efile!). Saves the
6537
+ name of the file specified by the -srcfile option if applicable.
6471
6538
 
6472
6539
  -execute[*NUM*]
6473
6540
  Execute command for all arguments up to this point on the command
@@ -6480,6 +6547,14 @@ OPTIONS
6480
6547
  feature. If a *NUM* is specified, the -q option no longer
6481
6548
  suppresses the output "{readyNUM}" message.
6482
6549
 
6550
+ -file*NUM* *ALTFILE*
6551
+ Read tags from an alternate source file. These tags are accessed
6552
+ via the family 8 group name (eg. "File1:TAG" for the -file1 option,
6553
+ "File2:TAG" for -file2, etc). *ALTFILE* may contain filename
6554
+ formatting codes %d, %f and %e. Among other things, this allows
6555
+ tags from different files to be compared and combined using the -if
6556
+ and -p options.
6557
+
6483
6558
  -list_dir
6484
6559
  List directories themselves instead of their contents. This option
6485
6560
  effectively causes directories to be treated as normal files when