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.
- package/bin/exiftool_files/Changes +97 -4
- package/bin/exiftool_files/README +19 -19
- package/bin/exiftool_files/arg_files/xmp2exif.args +4 -1
- package/bin/exiftool_files/config_files/example.config +1 -0
- package/bin/exiftool_files/config_files/rotate_regions.config +1 -1
- package/bin/exiftool_files/exiftool.pl +198 -123
- package/bin/exiftool_files/fmt_files/kml.fmt +3 -0
- package/bin/exiftool_files/fmt_files/kml_track.fmt +3 -0
- package/bin/exiftool_files/lib/Image/ExifTool/AIFF.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/APE.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +25 -19
- package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +33 -7
- package/bin/exiftool_files/lib/Image/ExifTool/CanonRaw.pm +5 -1
- package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +28 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +107 -20
- package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +92 -9
- package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +9 -4
- package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +7 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +30 -7
- package/bin/exiftool_files/lib/Image/ExifTool/InfiRay.pm +227 -0
- package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +53 -7
- package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +5 -5
- package/bin/exiftool_files/lib/Image/ExifTool/LIF.pm +10 -2
- package/bin/exiftool_files/lib/Image/ExifTool/LNK.pm +5 -4
- package/bin/exiftool_files/lib/Image/ExifTool/MIE.pm +3 -3
- package/bin/exiftool_files/lib/Image/ExifTool/MPEG.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/MakerNotes.pm +3 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Minolta.pm +6 -7
- package/bin/exiftool_files/lib/Image/ExifTool/MinoltaRaw.pm +2 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +1199 -1325
- package/bin/exiftool_files/lib/Image/ExifTool/NikonCustom.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/NikonSettings.pm +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +88 -6
- package/bin/exiftool_files/lib/Image/ExifTool/OpenEXR.pm +32 -15
- package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +89 -3
- package/bin/exiftool_files/lib/Image/ExifTool/PanasonicRaw.pm +27 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +8 -5
- package/bin/exiftool_files/lib/Image/ExifTool/PhaseOne.pm +14 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +38 -7
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +44 -13
- package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +63 -20
- package/bin/exiftool_files/lib/Image/ExifTool/README +19 -2
- package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +34 -13
- package/bin/exiftool_files/lib/Image/ExifTool/Rawzor.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Real.pm +2 -2
- package/bin/exiftool_files/lib/Image/ExifTool/Ricoh.pm +2 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Sigma.pm +5 -4
- package/bin/exiftool_files/lib/Image/ExifTool/SigmaRaw.pm +9 -3
- package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +28 -1
- package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +4691 -4624
- package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +511 -117
- package/bin/exiftool_files/lib/Image/ExifTool/VCard.pm +19 -5
- package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +5 -5
- package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +42 -0
- package/bin/exiftool_files/lib/Image/ExifTool/WriteXMP.pl +1 -1
- package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +150 -36
- package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +19 -4
- package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +2 -1
- package/bin/exiftool_files/lib/Image/ExifTool.pm +248 -54
- package/bin/exiftool_files/lib/Image/ExifTool.pod +94 -58
- 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.
|
|
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 $
|
|
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, '-
|
|
248
|
-
'-efile' => 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, '-
|
|
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, '-
|
|
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
|
-
$
|
|
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
|
-
|
|
1138
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
-
$
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
$
|
|
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 $
|
|
4178
|
+
my $seq;
|
|
4137
4179
|
if ($tok eq 'C') {
|
|
4138
|
-
$
|
|
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($
|
|
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' ?
|
|
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{$
|
|
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 |
|
|
4571
|
-
CRM r/w | GZ r | MOBI r | PGM r/w |
|
|
4572
|
-
CRW r/w | HDP r/w | MODD r | PLIST r |
|
|
4573
|
-
CS1 r/w | HDR r | MOI r | PICT r |
|
|
4574
|
-
CSV r | HEIC r/w | MOS r/w | PMP r |
|
|
4575
|
-
CUR r | HEIF r/w | MOV r/w | PNG r/w |
|
|
4576
|
-
CZI r | HTML r | MP3 r | PPM r/w |
|
|
4577
|
-
DCM r | ICC r/w/c | MP4 r/w | PPT r |
|
|
4578
|
-
DCP r/w | ICO r | MPC r | PPTX r |
|
|
4579
|
-
DCR r | ICS r | MPG r | PS r/w |
|
|
4580
|
-
DFONT r | IDML r | MPO r/w | PSB r/w |
|
|
4581
|
-
DIVX r | IIQ r/w | MQV r/w | PSD r/w |
|
|
4582
|
-
DJVU r | IND r/w | MRC r | PSP r |
|
|
4583
|
-
DLL r | INSP r/w | MRW r/w | QTIF r/w |
|
|
4584
|
-
DNG r/w | INSV r | MXF r | R3D r |
|
|
4585
|
-
DOC r | INX r | NEF r/w | RA 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]]
|
|
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").
|
|
4735
|
-
|
|
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
|
|
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.
|
|
4997
|
-
|
|
4998
|
-
|
|
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 -
|
|
5065
|
+
exiftool -tagsfromfile @ '-subject<make' '-+subject<model' ...
|
|
5001
5066
|
|
|
5002
|
-
Similarly,
|
|
5003
|
-
|
|
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
|
|
5234
|
-
number of files, it is recommended to either use the JSON
|
|
5235
|
-
XML (-X) output format, or use -p to generate a
|
|
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
|
|
5274
|
-
|
|
5275
|
-
|
|
5276
|
-
dash ("-")
|
|
5277
|
-
|
|
5278
|
-
|
|
5279
|
-
|
|
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)
|
|
5286
|
-
family number is not specified. May be combined with
|
|
5287
|
-
to add group names to the output. Multiple families
|
|
5288
|
-
specified by separating them with colons. By default the
|
|
5289
|
-
group name is simplified by removing any leading "Main:"
|
|
5290
|
-
collapsing adjacent identical group names, but this can be
|
|
5291
|
-
by placing a colon before the first family number (eg.
|
|
5292
|
-
the -listg option to list group names for a specified
|
|
5293
|
-
API SavePath and SaveFormat options are automatically
|
|
5294
|
-
the respective family 5 or 6 group names are requested.
|
|
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
|
-
|
|
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.
|
|
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
|
|
6015
|
-
compatible with
|
|
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 "##" (
|
|
6163
|
-
|
|
6164
|
-
|
|
6165
|
-
|
|
6166
|
-
|
|
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
|
|
6391
|
-
the MWG Tags documentation for more details. Note that
|
|
6392
|
-
is not reversible, and remains in effect until the
|
|
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),
|
|
6466
|
-
|
|
6467
|
-
the same
|
|
6468
|
-
|
|
6469
|
-
|
|
6470
|
-
|
|
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
|