exiftool-vendored.pl 13.0.1 → 13.17.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/Changes +269 -20
- package/bin/MANIFEST +10 -0
- package/bin/META.json +1 -1
- package/bin/META.yml +1 -1
- package/bin/README +3 -3
- package/bin/arg_files/exif2xmp.args +4 -0
- package/bin/arg_files/xmp2exif.args +2 -1
- package/bin/build_geolocation +1 -1
- package/bin/exiftool +356 -213
- package/bin/lib/File/RandomAccess.pm +1 -1
- package/bin/lib/File/RandomAccess.pod +2 -2
- package/bin/lib/Image/ExifTool/AAC.pm +1 -1
- package/bin/lib/Image/ExifTool/AES.pm +1 -1
- package/bin/lib/Image/ExifTool/AFCP.pm +6 -6
- package/bin/lib/Image/ExifTool/AIFF.pm +2 -2
- package/bin/lib/Image/ExifTool/APE.pm +2 -2
- package/bin/lib/Image/ExifTool/APP12.pm +1 -1
- package/bin/lib/Image/ExifTool/ASF.pm +2 -2
- package/bin/lib/Image/ExifTool/Apple.pm +11 -9
- package/bin/lib/Image/ExifTool/Audible.pm +1 -1
- package/bin/lib/Image/ExifTool/BMP.pm +1 -1
- package/bin/lib/Image/ExifTool/BPG.pm +1 -1
- package/bin/lib/Image/ExifTool/BZZ.pm +1 -1
- package/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
- package/bin/lib/Image/ExifTool/BuildTagLookup.pm +46 -26
- package/bin/lib/Image/ExifTool/CBOR.pm +5 -2
- package/bin/lib/Image/ExifTool/Canon.pm +68 -28
- package/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
- package/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
- package/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
- package/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
- package/bin/lib/Image/ExifTool/Casio.pm +1 -1
- package/bin/lib/Image/ExifTool/Charset.pm +1 -1
- package/bin/lib/Image/ExifTool/DICOM.pm +1 -1
- package/bin/lib/Image/ExifTool/DJI.pm +196 -30
- package/bin/lib/Image/ExifTool/DNG.pm +1 -1
- package/bin/lib/Image/ExifTool/DPX.pm +1 -1
- package/bin/lib/Image/ExifTool/DV.pm +1 -1
- package/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
- package/bin/lib/Image/ExifTool/DjVu.pm +1 -1
- package/bin/lib/Image/ExifTool/EXE.pm +138 -33
- package/bin/lib/Image/ExifTool/Exif.pm +29 -16
- package/bin/lib/Image/ExifTool/FITS.pm +3 -3
- package/bin/lib/Image/ExifTool/FLAC.pm +1 -1
- package/bin/lib/Image/ExifTool/FLIF.pm +3 -3
- package/bin/lib/Image/ExifTool/FLIR.pm +1 -1
- package/bin/lib/Image/ExifTool/Fixup.pm +1 -1
- package/bin/lib/Image/ExifTool/Flash.pm +1 -1
- package/bin/lib/Image/ExifTool/FlashPix.pm +17 -21
- package/bin/lib/Image/ExifTool/Font.pm +2 -2
- package/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
- package/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
- package/bin/lib/Image/ExifTool/GE.pm +1 -1
- package/bin/lib/Image/ExifTool/GIF.pm +144 -93
- package/bin/lib/Image/ExifTool/GIMP.pm +1 -1
- package/bin/lib/Image/ExifTool/GM.pm +1 -1
- package/bin/lib/Image/ExifTool/GPS.pm +34 -30
- package/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
- package/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
- package/bin/lib/Image/ExifTool/Geolocation.pm +19 -9
- package/bin/lib/Image/ExifTool/Geotag.pm +46 -12
- package/bin/lib/Image/ExifTool/GoPro.pm +120 -8
- package/bin/lib/Image/ExifTool/H264.pm +1 -1
- package/bin/lib/Image/ExifTool/HP.pm +2 -2
- package/bin/lib/Image/ExifTool/HTML.pm +1 -1
- package/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
- package/bin/lib/Image/ExifTool/ICC_Profile.pm +81 -2
- package/bin/lib/Image/ExifTool/ICO.pm +1 -1
- package/bin/lib/Image/ExifTool/ID3.pm +8 -8
- package/bin/lib/Image/ExifTool/IPTC.pm +10 -7
- package/bin/lib/Image/ExifTool/ISO.pm +1 -1
- package/bin/lib/Image/ExifTool/ITC.pm +1 -1
- package/bin/lib/Image/ExifTool/Import.pm +5 -4
- package/bin/lib/Image/ExifTool/InDesign.pm +2 -2
- package/bin/lib/Image/ExifTool/InfiRay.pm +1 -1
- package/bin/lib/Image/ExifTool/JPEG.pm +38 -5
- package/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
- package/bin/lib/Image/ExifTool/JSON.pm +1 -1
- package/bin/lib/Image/ExifTool/JVC.pm +1 -1
- package/bin/lib/Image/ExifTool/Jpeg2000.pm +10 -9
- package/bin/lib/Image/ExifTool/Kodak.pm +1 -1
- package/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
- package/bin/lib/Image/ExifTool/LIF.pm +1 -1
- package/bin/lib/Image/ExifTool/LNK.pm +2 -2
- package/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/sk.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
- package/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
- package/bin/lib/Image/ExifTool/Leaf.pm +1 -1
- package/bin/lib/Image/ExifTool/LigoGPS.pm +409 -0
- package/bin/lib/Image/ExifTool/Lytro.pm +1 -1
- package/bin/lib/Image/ExifTool/M2TS.pm +57 -18
- package/bin/lib/Image/ExifTool/MIE.pm +15 -6
- package/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
- package/bin/lib/Image/ExifTool/MIFF.pm +1 -1
- package/bin/lib/Image/ExifTool/MISB.pm +1 -1
- package/bin/lib/Image/ExifTool/MNG.pm +1 -1
- package/bin/lib/Image/ExifTool/MOI.pm +1 -1
- package/bin/lib/Image/ExifTool/MPC.pm +1 -1
- package/bin/lib/Image/ExifTool/MPEG.pm +1 -1
- package/bin/lib/Image/ExifTool/MPF.pm +1 -1
- package/bin/lib/Image/ExifTool/MRC.pm +1 -1
- package/bin/lib/Image/ExifTool/MWG.pm +1 -1
- package/bin/lib/Image/ExifTool/MXF.pm +3 -3
- package/bin/lib/Image/ExifTool/MacOS.pm +3 -2
- package/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
- package/bin/lib/Image/ExifTool/Matroska.pm +22 -6
- package/bin/lib/Image/ExifTool/Microsoft.pm +2 -2
- package/bin/lib/Image/ExifTool/Minolta.pm +1 -1
- package/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
- package/bin/lib/Image/ExifTool/Motorola.pm +1 -1
- package/bin/lib/Image/ExifTool/Nikon.pm +457 -103
- package/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
- package/bin/lib/Image/ExifTool/NikonCustom.pm +6 -6
- package/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
- package/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
- package/bin/lib/Image/ExifTool/OOXML.pm +8 -8
- package/bin/lib/Image/ExifTool/Ogg.pm +1 -1
- package/bin/lib/Image/ExifTool/Olympus.pm +1 -1
- package/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
- package/bin/lib/Image/ExifTool/Opus.pm +1 -1
- package/bin/lib/Image/ExifTool/Other.pm +1 -1
- package/bin/lib/Image/ExifTool/PCX.pm +1 -1
- package/bin/lib/Image/ExifTool/PDF.pm +49 -18
- package/bin/lib/Image/ExifTool/PGF.pm +1 -1
- package/bin/lib/Image/ExifTool/PICT.pm +1 -1
- package/bin/lib/Image/ExifTool/PLIST.pm +4 -4
- package/bin/lib/Image/ExifTool/PLUS.pm +1 -1
- package/bin/lib/Image/ExifTool/PNG.pm +20 -8
- package/bin/lib/Image/ExifTool/PPM.pm +12 -3
- package/bin/lib/Image/ExifTool/PSP.pm +1 -1
- package/bin/lib/Image/ExifTool/Palm.pm +1 -1
- package/bin/lib/Image/ExifTool/Panasonic.pm +27 -3
- package/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
- package/bin/lib/Image/ExifTool/Parrot.pm +1 -1
- package/bin/lib/Image/ExifTool/Pentax.pm +1 -1
- package/bin/lib/Image/ExifTool/PhaseOne.pm +4 -4
- package/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
- package/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
- package/bin/lib/Image/ExifTool/Photoshop.pm +65 -4
- package/bin/lib/Image/ExifTool/PostScript.pm +1 -1
- package/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
- package/bin/lib/Image/ExifTool/Protobuf.pm +270 -0
- package/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
- package/bin/lib/Image/ExifTool/QuickTime.pm +327 -88
- package/bin/lib/Image/ExifTool/QuickTimeStream.pl +199 -195
- package/bin/lib/Image/ExifTool/README +12 -2
- package/bin/lib/Image/ExifTool/RIFF.pm +21 -6
- package/bin/lib/Image/ExifTool/RSRC.pm +1 -1
- package/bin/lib/Image/ExifTool/RTF.pm +2 -2
- package/bin/lib/Image/ExifTool/Radiance.pm +1 -1
- package/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
- package/bin/lib/Image/ExifTool/Real.pm +1 -1
- package/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
- package/bin/lib/Image/ExifTool/Red.pm +1 -1
- package/bin/lib/Image/ExifTool/Ricoh.pm +4 -4
- package/bin/lib/Image/ExifTool/Samsung.pm +6 -2
- package/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
- package/bin/lib/Image/ExifTool/Scalado.pm +1 -1
- package/bin/lib/Image/ExifTool/Shift.pl +1 -1
- package/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
- package/bin/lib/Image/ExifTool/Sigma.pm +1 -1
- package/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
- package/bin/lib/Image/ExifTool/Sony.pm +6 -5
- package/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
- package/bin/lib/Image/ExifTool/Stim.pm +1 -1
- package/bin/lib/Image/ExifTool/TagInfoXML.pm +6 -5
- package/bin/lib/Image/ExifTool/TagLookup.pm +7028 -6968
- package/bin/lib/Image/ExifTool/TagNames.pod +12079 -11630
- package/bin/lib/Image/ExifTool/Text.pm +4 -3
- package/bin/lib/Image/ExifTool/Theora.pm +1 -1
- package/bin/lib/Image/ExifTool/Torrent.pm +3 -3
- package/bin/lib/Image/ExifTool/Trailer.pm +318 -0
- package/bin/lib/Image/ExifTool/Unknown.pm +1 -1
- package/bin/lib/Image/ExifTool/VCard.pm +3 -3
- package/bin/lib/Image/ExifTool/Validate.pm +6 -6
- package/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
- package/bin/lib/Image/ExifTool/WPG.pm +1 -1
- package/bin/lib/Image/ExifTool/WTV.pm +1 -1
- package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
- package/bin/lib/Image/ExifTool/WriteExif.pl +3 -3
- package/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
- package/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
- package/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
- package/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
- package/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
- package/bin/lib/Image/ExifTool/WriteQuickTime.pl +170 -79
- package/bin/lib/Image/ExifTool/WriteRIFF.pl +17 -6
- package/bin/lib/Image/ExifTool/WriteXMP.pl +3 -3
- package/bin/lib/Image/ExifTool/Writer.pl +89 -96
- package/bin/lib/Image/ExifTool/XISF.pm +1 -1
- package/bin/lib/Image/ExifTool/XMP.pm +28 -13
- package/bin/lib/Image/ExifTool/XMP2.pl +106 -3
- package/bin/lib/Image/ExifTool/XMPStruct.pl +2 -3
- package/bin/lib/Image/ExifTool/ZIP.pm +2 -2
- package/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
- package/bin/lib/Image/ExifTool/iWork.pm +1 -1
- package/bin/lib/Image/ExifTool.pm +467 -228
- package/bin/lib/Image/ExifTool.pod +118 -72
- package/bin/perl-Image-ExifTool.spec +1 -1
- package/bin/windows_exiftool.txt +96 -51
- package/package.json +6 -6
package/bin/exiftool
CHANGED
|
@@ -11,7 +11,7 @@ use strict;
|
|
|
11
11
|
use warnings;
|
|
12
12
|
require 5.004;
|
|
13
13
|
|
|
14
|
-
my $version = '13.
|
|
14
|
+
my $version = '13.17';
|
|
15
15
|
|
|
16
16
|
# add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
|
|
17
17
|
my $exePath;
|
|
@@ -63,6 +63,7 @@ sub AddSetTagsFile($;$);
|
|
|
63
63
|
sub Warning($$);
|
|
64
64
|
sub DoSetFromFile($$$);
|
|
65
65
|
sub CleanFilename($);
|
|
66
|
+
sub HasWildcards($);
|
|
66
67
|
sub SetWindowTitle($);
|
|
67
68
|
sub ProcessFiles($;$);
|
|
68
69
|
sub ScanDir($$;$);
|
|
@@ -596,6 +597,10 @@ if (@Image::ExifTool::UserDefined::Arguments) {
|
|
|
596
597
|
unshift @ARGV, @Image::ExifTool::UserDefined::Arguments;
|
|
597
598
|
}
|
|
598
599
|
|
|
600
|
+
if ($version ne $Image::ExifTool::VERSION) {
|
|
601
|
+
Warn "Application version $version does not match Image::ExifTool library version $Image::ExifTool::VERSION\n";
|
|
602
|
+
}
|
|
603
|
+
|
|
599
604
|
# parse command-line options in 2 passes...
|
|
600
605
|
# pass 1: set all of our ExifTool options
|
|
601
606
|
# pass 2: print all of our help and informational output (-list, -ver, etc)
|
|
@@ -636,7 +641,7 @@ for (;;) {
|
|
|
636
641
|
}
|
|
637
642
|
# require MWG module if used in any argument
|
|
638
643
|
# (note: doesn't cover the -p option because these tags will be parsed on the 2nd pass)
|
|
639
|
-
$useMWG = 1 if not $useMWG and grep /^mwg:/i, @tags, @requestTags;
|
|
644
|
+
$useMWG = 1 if not $useMWG and grep /^([--_0-9A-Z]+:)*1?mwg:/i, @tags, @requestTags;
|
|
640
645
|
if ($useMWG) {
|
|
641
646
|
require Image::ExifTool::MWG;
|
|
642
647
|
Image::ExifTool::MWG::Load();
|
|
@@ -856,7 +861,7 @@ for (;;) {
|
|
|
856
861
|
} else {
|
|
857
862
|
print "Available API Options:\n";
|
|
858
863
|
my $availableOptions = Image::ExifTool::AvailableOptions();
|
|
859
|
-
printf(" %-17s - %s\n", $$_[0], $$_[2]) foreach @$availableOptions;
|
|
864
|
+
$$_[3] or printf(" %-17s - %s\n", $$_[0], $$_[2]) foreach @$availableOptions;
|
|
860
865
|
$helped = 1;
|
|
861
866
|
}
|
|
862
867
|
next;
|
|
@@ -1039,7 +1044,7 @@ for (;;) {
|
|
|
1039
1044
|
}
|
|
1040
1045
|
$trkfile or Error("Expecting file name for -geotag option\n"), $badCmd=1, next;
|
|
1041
1046
|
# allow wildcards in filename
|
|
1042
|
-
if ($trkfile
|
|
1047
|
+
if (HasWildcards($trkfile)) {
|
|
1043
1048
|
# CORE::glob() splits on white space, so use File::Glob if possible
|
|
1044
1049
|
my @trks;
|
|
1045
1050
|
if ($^O eq 'MSWin32' and eval { require Win32::FindFile }) {
|
|
@@ -1088,7 +1093,7 @@ for (;;) {
|
|
|
1088
1093
|
# prevent processing file unnecessarily for simple case of failed '$ok' or 'not $ok'
|
|
1089
1094
|
$cond =~ /^\s*(not\s*)\$ok\s*$/i and ($1 xor $rtnValPrev) and $failCondition=1;
|
|
1090
1095
|
# add to list of requested tags
|
|
1091
|
-
push @requestTags, $cond =~ /\$\{?((?:[
|
|
1096
|
+
push @requestTags, $cond =~ /\$\{?((?:[-_0-9A-Z]+:)*[-_0-9A-Z?*]+)/ig;
|
|
1092
1097
|
push @condition, $cond;
|
|
1093
1098
|
next;
|
|
1094
1099
|
}
|
|
@@ -1176,7 +1181,7 @@ for (;;) {
|
|
|
1176
1181
|
if ($pass) {
|
|
1177
1182
|
LoadPrintFormat($fmt, $1 || $binaryOutput);
|
|
1178
1183
|
# load MWG module now if necessary
|
|
1179
|
-
if (not $useMWG and grep /^mwg:/i, @requestTags) {
|
|
1184
|
+
if (not $useMWG and grep /^([-_0-9A-Z]+:)*1?mwg:/i, @requestTags) {
|
|
1180
1185
|
$useMWG = 1;
|
|
1181
1186
|
require Image::ExifTool::MWG;
|
|
1182
1187
|
Image::ExifTool::MWG::Load();
|
|
@@ -1375,11 +1380,11 @@ for (;;) {
|
|
|
1375
1380
|
push @newValues, { SaveCount => ++$saveCount };
|
|
1376
1381
|
}
|
|
1377
1382
|
push @newValues, $_;
|
|
1378
|
-
if (/^mwg:/i) {
|
|
1383
|
+
if (/^([-_0-9A-Z]+:)*1?mwg:/i) {
|
|
1379
1384
|
$useMWG = 1;
|
|
1380
|
-
} elsif (/^([
|
|
1385
|
+
} elsif (/^([-_0-9A-Z]+:)*(filename|directory|testname)\b/i) {
|
|
1381
1386
|
$doSetFileName = 1;
|
|
1382
|
-
} elsif (/^([
|
|
1387
|
+
} elsif (/^([-_0-9A-Z]+:)*(geotag|geotime|geosync|geolocate)\b/i) {
|
|
1383
1388
|
if (lc $2 eq 'geotime') {
|
|
1384
1389
|
$addGeotime = '';
|
|
1385
1390
|
} else {
|
|
@@ -1397,25 +1402,23 @@ for (;;) {
|
|
|
1397
1402
|
if ($setTagsFile) {
|
|
1398
1403
|
push @{$setTags{$setTagsFile}}, $_;
|
|
1399
1404
|
if ($1 eq '>') {
|
|
1400
|
-
$useMWG = 1 if /^(.*>\s*)?mwg:/si;
|
|
1405
|
+
$useMWG = 1 if /^(.*>\s*)?([-_0-9A-Z]+:)*1?mwg:/si;
|
|
1401
1406
|
if (/\b(filename|directory|testname)#?$/i) {
|
|
1402
1407
|
$doSetFileName = 1;
|
|
1403
1408
|
} elsif (/\bgeotime#?$/i) {
|
|
1404
1409
|
$addGeotime = '';
|
|
1405
1410
|
}
|
|
1406
1411
|
} else {
|
|
1407
|
-
$useMWG = 1 if /^([^<]+<\s*(.*\$\{?)?)?mwg:/si;
|
|
1408
|
-
if (/^([
|
|
1412
|
+
$useMWG = 1 if /^([^<]+<\s*(.*\$\{?)?)?([-_0-9A-Z]+:)*1?mwg:/si;
|
|
1413
|
+
if (/^([-_0-9A-Z]+:)*(filename|directory|testname)\b/i) {
|
|
1409
1414
|
$doSetFileName = 1;
|
|
1410
|
-
} elsif (/^([
|
|
1415
|
+
} elsif (/^([-_0-9A-Z]+:)*geotime\b/i) {
|
|
1411
1416
|
$addGeotime = '';
|
|
1412
1417
|
}
|
|
1413
1418
|
}
|
|
1414
1419
|
} else {
|
|
1415
1420
|
my $lst = s/^-// ? \@exclude : \@tags;
|
|
1416
|
-
unless
|
|
1417
|
-
Warn(qq(Invalid TAG name: "$_"\n));
|
|
1418
|
-
}
|
|
1421
|
+
Warn(qq(Invalid TAG name: "$_"\n)) unless /^([-_0-9A-Z*]+:)*([-_0-9A-Z*?]+)#?$/i;
|
|
1419
1422
|
push @$lst, $_; # (push everything for backward compatibility)
|
|
1420
1423
|
}
|
|
1421
1424
|
}
|
|
@@ -1425,7 +1428,7 @@ for (;;) {
|
|
|
1425
1428
|
push @nextPass, $_;
|
|
1426
1429
|
next;
|
|
1427
1430
|
}
|
|
1428
|
-
if ($doGlob and
|
|
1431
|
+
if ($doGlob and HasWildcards($_)) {
|
|
1429
1432
|
if ($^O eq 'MSWin32' and eval { require Win32::FindFile }) {
|
|
1430
1433
|
push @files, FindFileWindows($mt, $_);
|
|
1431
1434
|
} else {
|
|
@@ -1522,6 +1525,7 @@ if (($tagOut or defined $diff) and ($csv or $json or %printFmt or $tabFormat or
|
|
|
1522
1525
|
}
|
|
1523
1526
|
|
|
1524
1527
|
if ($csv and $csv eq 'CSV' and not $isWriting) {
|
|
1528
|
+
$json = 0; # (not compatible)
|
|
1525
1529
|
if ($textOut) {
|
|
1526
1530
|
Warn "Sorry, -w may not be combined with -csv\n";
|
|
1527
1531
|
$rtnVal = 1;
|
|
@@ -1757,9 +1761,11 @@ if (@newValues) {
|
|
|
1757
1761
|
$wrn and Warning($mt, $wrn);
|
|
1758
1762
|
}
|
|
1759
1763
|
# exclude specified tags
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1764
|
+
unless ($csv) {
|
|
1765
|
+
foreach (@exclude) {
|
|
1766
|
+
$mt->SetNewValue($_, undef, Replace => 2);
|
|
1767
|
+
$needSave = 1;
|
|
1768
|
+
}
|
|
1763
1769
|
}
|
|
1764
1770
|
unless ($isWriting or $outOpt or @tags) {
|
|
1765
1771
|
Warn "Nothing to do.\n";
|
|
@@ -1775,7 +1781,7 @@ if ($isWriting) {
|
|
|
1775
1781
|
if (defined $diff) {
|
|
1776
1782
|
Error "Can't use -diff option when writing tags\n";
|
|
1777
1783
|
next;
|
|
1778
|
-
} elsif (@tags and not $outOpt) {
|
|
1784
|
+
} elsif (@tags and not $outOpt and not $csv) {
|
|
1779
1785
|
my ($tg, $s) = @tags > 1 ? ("$tags[0] ...", 's') : ($tags[0], '');
|
|
1780
1786
|
Warn "Ignored superfluous tag name$s or invalid option$s: -$tg\n";
|
|
1781
1787
|
}
|
|
@@ -1802,7 +1808,7 @@ if ($binaryOutput) {
|
|
|
1802
1808
|
}
|
|
1803
1809
|
|
|
1804
1810
|
# sort by groups to look nicer depending on options
|
|
1805
|
-
if (defined $showGroup and not (@tags and $allGroup) and ($sortOpt or not defined $sortOpt)) {
|
|
1811
|
+
if (defined $showGroup and not (@tags and ($allGroup or $csv)) and ($sortOpt or not defined $sortOpt)) {
|
|
1806
1812
|
$mt->Options(Sort => "Group$showGroup");
|
|
1807
1813
|
}
|
|
1808
1814
|
|
|
@@ -1840,7 +1846,7 @@ $altEnc = $mt->Options('Charset');
|
|
|
1840
1846
|
undef $altEnc if $altEnc eq 'UTF8';
|
|
1841
1847
|
|
|
1842
1848
|
# set flag to fix description lengths if necessary
|
|
1843
|
-
if (not $altEnc and $mt->Options('Lang') ne 'en'
|
|
1849
|
+
if (not $altEnc and $mt->Options('Lang') ne 'en') {
|
|
1844
1850
|
# (note that Unicode::GCString is part of the Unicode::LineBreak package)
|
|
1845
1851
|
$fixLen = eval { require Unicode::GCString } ? 2 : 1;
|
|
1846
1852
|
}
|
|
@@ -1912,7 +1918,7 @@ if (@dbKeys) {
|
|
|
1912
1918
|
print $vout "Imported entry for '${_}' (full path: '${absPath}')\n";
|
|
1913
1919
|
}
|
|
1914
1920
|
} elsif ($verbose and $verbose > 1) {
|
|
1915
|
-
print $vout "Imported entry for '${_}' (
|
|
1921
|
+
print $vout "Imported entry for '${_}' (no full path)\n";
|
|
1916
1922
|
}
|
|
1917
1923
|
}
|
|
1918
1924
|
}
|
|
@@ -2166,7 +2172,11 @@ sub GetImageInfo($$)
|
|
|
2166
2172
|
}
|
|
2167
2173
|
# can't make use of $info if verbose because we must reprocess
|
|
2168
2174
|
# the file anyway to generate the verbose output
|
|
2169
|
-
|
|
2175
|
+
# (also if writing just to avoid double-incrementing FileSequence)
|
|
2176
|
+
if ($isWriting or $verbose or defined $fastCondition or defined $diff) {
|
|
2177
|
+
undef $info;
|
|
2178
|
+
--$$et{FILE_SEQUENCE};
|
|
2179
|
+
}
|
|
2170
2180
|
} elsif ($file =~ s/^(\@JSON:)(.*)/$1/) {
|
|
2171
2181
|
# read JSON file from command line
|
|
2172
2182
|
my $dat = $2;
|
|
@@ -2286,6 +2296,10 @@ sub GetImageInfo($$)
|
|
|
2286
2296
|
$et->Options(Duplicates => 1, Sort => "Group$showGroup", Verbose => 0);
|
|
2287
2297
|
$et2 = Image::ExifTool->new;
|
|
2288
2298
|
$et2->Options(%{$$et{OPTIONS}});
|
|
2299
|
+
# must set list options specifically because they may have been
|
|
2300
|
+
# set incorrectly from deprecated List settings
|
|
2301
|
+
$et2->Options(ListSep => $$et{OPTIONS}{ListSep});
|
|
2302
|
+
$et2->Options(ListSplit => $$et{OPTIONS}{ListSplit});
|
|
2289
2303
|
@found2 = @foundTags;
|
|
2290
2304
|
$info2 = $et2->ImageInfo($file2, \@found2);
|
|
2291
2305
|
} else {
|
|
@@ -2342,14 +2356,15 @@ sub GetImageInfo($$)
|
|
|
2342
2356
|
|
|
2343
2357
|
# print differences if requested
|
|
2344
2358
|
if (defined $diff) {
|
|
2345
|
-
my (%done2, $wasDiff, @diffs, @groupTags2);
|
|
2359
|
+
my (%done, %done2, $wasDiff, @diffs, @groupTags2);
|
|
2346
2360
|
my $v = $verbose || 0;
|
|
2347
2361
|
print $fp "======== diff < $file > $file2\n";
|
|
2348
2362
|
my ($g2, $same) = (0, 0); # start with $g2 false, but not equal to '' to avoid infinite loop
|
|
2349
2363
|
for (;;) {
|
|
2364
|
+
my ($g, $tag2, $i, $key, @dupl, $val2, $t2, $equal, %used);
|
|
2350
2365
|
my $tag = shift @foundTags;
|
|
2351
|
-
my ($g, $tag2);
|
|
2352
2366
|
if (defined $tag) {
|
|
2367
|
+
$done{$tag} = 1;
|
|
2353
2368
|
$g = $et->GetGroup($tag, $showGroup);
|
|
2354
2369
|
} else {
|
|
2355
2370
|
for (;;) {
|
|
@@ -2359,7 +2374,6 @@ sub GetImageInfo($$)
|
|
|
2359
2374
|
}
|
|
2360
2375
|
}
|
|
2361
2376
|
if ($g ne $g2) {
|
|
2362
|
-
my $t2;
|
|
2363
2377
|
# add any outstanding tags from diff file not yet handled in previous group ($g2)
|
|
2364
2378
|
foreach $t2 (@groupTags2) {
|
|
2365
2379
|
next if $done2{$t2};
|
|
@@ -2390,6 +2404,7 @@ sub GetImageInfo($$)
|
|
|
2390
2404
|
($g2, $same) = ($g, 0);
|
|
2391
2405
|
# build list of all tags in the new group of the diff file
|
|
2392
2406
|
@groupTags2 = ();
|
|
2407
|
+
push @groupTags2, $tag2 if defined $tag2;
|
|
2393
2408
|
foreach $t2 (@found2) {
|
|
2394
2409
|
$done2{$t2} or $g ne $et2->GetGroup($t2, $showGroup) or push @groupTags2, $t2;
|
|
2395
2410
|
}
|
|
@@ -2398,33 +2413,50 @@ sub GetImageInfo($$)
|
|
|
2398
2413
|
my $val = $et->GetValue($tag);
|
|
2399
2414
|
next unless defined $val; # (just in case)
|
|
2400
2415
|
my $name = GetTagName($tag);
|
|
2401
|
-
|
|
2416
|
+
my $desc = $outFormat < 1 ? $et->GetDescription($tag) : $name;
|
|
2417
|
+
# get matching tag key(s) from diff file
|
|
2402
2418
|
my @tags2 = grep /^$name( |$)/, @groupTags2;
|
|
2403
|
-
|
|
2404
|
-
my ($val2, $t2);
|
|
2405
|
-
foreach $t2 (@tags2) {
|
|
2419
|
+
T2: foreach $t2 (@tags2) {
|
|
2406
2420
|
next if $done2{$t2};
|
|
2407
2421
|
$tag2 = $t2;
|
|
2408
2422
|
$val2 = $et2->GetValue($t2);
|
|
2423
|
+
next unless defined $val2;
|
|
2424
|
+
IsEqual($val, $val2) and $equal = 1, last;
|
|
2425
|
+
# look ahead for upcoming duplicate tags in this group to see
|
|
2426
|
+
# if any would later match this value (and skip those for now)
|
|
2427
|
+
if ($$et{DUPL_TAG}{$name} and not @dupl) {
|
|
2428
|
+
for ($i=0, $key=$name; $i<=$$et{DUPL_TAG}{$name}; ++$i, $key="$name ($i)") {
|
|
2429
|
+
push @dupl, $key unless $done{$key} or $g ne $et->GetGroup($key, $showGroup);
|
|
2430
|
+
}
|
|
2431
|
+
@dupl = sort { $$et{FILE_ORDER}{$a} <=> $$et{FILE_ORDER}{$b} } @dupl if @dupl > 1;
|
|
2432
|
+
}
|
|
2433
|
+
foreach (@dupl) {
|
|
2434
|
+
next if $used{$_};
|
|
2435
|
+
my $v = $et->GetValue($_);
|
|
2436
|
+
next unless defined($v) and IsEqual($v, $val2);
|
|
2437
|
+
$used{$_} = 1; # would match this upcoming tag
|
|
2438
|
+
undef($tag2); undef($val2);
|
|
2439
|
+
next T2;
|
|
2440
|
+
}
|
|
2409
2441
|
last;
|
|
2410
2442
|
}
|
|
2411
|
-
if (
|
|
2443
|
+
if ($equal) {
|
|
2412
2444
|
++$same;
|
|
2413
2445
|
} else {
|
|
2414
|
-
my $len = LengthUTF8($
|
|
2446
|
+
my $len = LengthUTF8($desc);
|
|
2415
2447
|
my $pad = $outFormat < 2 ? ' ' x ($len < 32 ? 32 - $len : 0) : '';
|
|
2416
2448
|
if ($allGroup) {
|
|
2417
2449
|
my $grp = "[$g]";
|
|
2418
2450
|
$grp .= ' ' x (15 - length($grp)) if length($grp) < 15 and $outFormat < 2;
|
|
2419
|
-
push @diffs, sprintf "< %s %s%s: %s\n", $grp, $
|
|
2451
|
+
push @diffs, sprintf "< %s %s%s: %s\n", $grp, $desc, $pad, Printable($val);
|
|
2420
2452
|
if (defined $val2) {
|
|
2421
|
-
$grp = ' ' x length($grp), $
|
|
2422
|
-
push @diffs, sprintf "> %s %s%s: %s\n", $grp, $
|
|
2453
|
+
$grp = ' ' x length($grp), $desc = ' ' x $len if $v < 3;
|
|
2454
|
+
push @diffs, sprintf "> %s %s%s: %s\n", $grp, $desc, $pad, Printable($val2);
|
|
2423
2455
|
}
|
|
2424
2456
|
} else {
|
|
2425
|
-
push @diffs, sprintf "< %s%s: %s\n", $
|
|
2426
|
-
$
|
|
2427
|
-
push @diffs, sprintf "> %s%s
|
|
2457
|
+
push @diffs, sprintf "< %s%s: %s\n", $desc, $pad, Printable($val);
|
|
2458
|
+
$desc = ' ' x $len if $v < 3;
|
|
2459
|
+
push @diffs, sprintf "> %s%s: %s\n", $desc, $pad, Printable($val2) if defined $val2;
|
|
2428
2460
|
}
|
|
2429
2461
|
}
|
|
2430
2462
|
$done2{$tag2} = 1 if defined $tag2;
|
|
@@ -2621,7 +2653,13 @@ TAG: foreach $tag (@foundTags) {
|
|
|
2621
2653
|
# (note that the tag key may look like "TAG #(1)" when the "#" feature is used)
|
|
2622
2654
|
next if $noDups and $tag =~ /^(.*?) ?\(/ and defined $$info{$1} and
|
|
2623
2655
|
$group eq $et->GetGroup($1, $showGroup);
|
|
2624
|
-
|
|
2656
|
+
if (not $group and ($xml or $json or $csv)) {
|
|
2657
|
+
if ($showGroup !~ /\b4\b/) {
|
|
2658
|
+
$group = 'Unknown';
|
|
2659
|
+
} elsif ($json and not $allGroup) {
|
|
2660
|
+
$group = 'Copy0';
|
|
2661
|
+
}
|
|
2662
|
+
}
|
|
2625
2663
|
if ($fp and not ($allGroup or $csv)) {
|
|
2626
2664
|
if ($lastGroup ne $group) {
|
|
2627
2665
|
if ($html) {
|
|
@@ -2843,6 +2881,17 @@ TAG: foreach $tag (@foundTags) {
|
|
|
2843
2881
|
my $num = $et->GetValue($tag, 'ValueConv');
|
|
2844
2882
|
$$val{num} = $num if defined $num and not IsEqual($num, $$val{val});
|
|
2845
2883
|
}
|
|
2884
|
+
my $ex = $$et{TAG_EXTRA}{$tag};
|
|
2885
|
+
$$val{'fmt'} = $$ex{G6} if defined $$ex{G6};
|
|
2886
|
+
if (defined $$ex{BinVal}) {
|
|
2887
|
+
my $max = ($$et{OPTIONS}{LimitLongValues} - 5) / 3;
|
|
2888
|
+
if ($max >= 0 and length($$ex{BinVal}) > int($max)) {
|
|
2889
|
+
$max = int $max;
|
|
2890
|
+
$$val{'hex'} = join ' ', unpack("(H2)$max", $$ex{BinVal}), '[...]';
|
|
2891
|
+
} else {
|
|
2892
|
+
$$val{'hex'} = join ' ', unpack '(H2)*', $$ex{BinVal};
|
|
2893
|
+
}
|
|
2894
|
+
}
|
|
2846
2895
|
}
|
|
2847
2896
|
}
|
|
2848
2897
|
FormatJSON($fp, $val, $ind, $quote);
|
|
@@ -3120,7 +3169,7 @@ sub SetImageInfo($$$)
|
|
|
3120
3169
|
next;
|
|
3121
3170
|
} elsif (ref $dyFile eq 'SCALAR') {
|
|
3122
3171
|
# set new values from CSV or JSON database
|
|
3123
|
-
my ($f, $found, $
|
|
3172
|
+
my ($f, $found, $csvTag, $tryTag, $tg);
|
|
3124
3173
|
undef $evalWarning;
|
|
3125
3174
|
local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] };
|
|
3126
3175
|
# force UTF-8 if the database was JSON
|
|
@@ -3137,10 +3186,44 @@ sub SetImageInfo($$$)
|
|
|
3137
3186
|
next unless defined $absPath and $csvInfo = $database{$absPath};
|
|
3138
3187
|
}
|
|
3139
3188
|
$found = 1;
|
|
3140
|
-
$verbose
|
|
3141
|
-
|
|
3142
|
-
|
|
3143
|
-
|
|
3189
|
+
if ($verbose) {
|
|
3190
|
+
print $vout "Setting new values from $csv database\n";
|
|
3191
|
+
print $vout 'Including tags: ',join(' ',@tags),"\n" if @tags;
|
|
3192
|
+
print $vout 'Excluding tags: ',join(' ',@exclude),"\n" if @exclude;
|
|
3193
|
+
}
|
|
3194
|
+
my @tryTags = (@exclude, @tags); # (exclude first because it takes priority)
|
|
3195
|
+
foreach (@tryTags) {
|
|
3196
|
+
tr/-0-9a-zA-Z_:#?*//dc; # remove illegal characters
|
|
3197
|
+
s/(^|:)(all:)+/$1/ig; # remove 'all' group names
|
|
3198
|
+
s/(^|:)all(#?)$/$1*$2/i; # convert 'all' tag name to '*'
|
|
3199
|
+
tr/?/./; s/\*/.*/g; # convert wildcards for regex
|
|
3200
|
+
}
|
|
3201
|
+
foreach $csvTag (OrderedKeys($csvInfo)) {
|
|
3202
|
+
# don't write SourceFile, Directory or FileName
|
|
3203
|
+
next if $csvTag =~ /^([-_0-9A-Z]+:)*(SourceFile|Directory|FileName)$/i;
|
|
3204
|
+
if (@tryTags) {
|
|
3205
|
+
my ($i, $tryGrp, $matched);
|
|
3206
|
+
TryMatch: for ($i=0; $i<@tryTags; ++$i) {
|
|
3207
|
+
$tryTag = $tryTags[$i];
|
|
3208
|
+
if ($tryTag =~ /:/) {
|
|
3209
|
+
next unless $csvTag =~ /:/; # db entry must also specify group
|
|
3210
|
+
my @csvGrps = split /:/, $csvTag;
|
|
3211
|
+
my @tryGrps = split /:/, $tryTag;
|
|
3212
|
+
my $tryName = pop @tryGrps;
|
|
3213
|
+
next unless pop(@csvGrps) =~ /^$tryName$/i; # tag name must match
|
|
3214
|
+
foreach $tryGrp (@tryGrps) {
|
|
3215
|
+
# each specified group name must match db entry
|
|
3216
|
+
next TryMatch unless grep /^$tryGrp$/i, @csvGrps;
|
|
3217
|
+
}
|
|
3218
|
+
$matched = 1;
|
|
3219
|
+
last;
|
|
3220
|
+
}
|
|
3221
|
+
# no group specified, so match by tag name only
|
|
3222
|
+
$csvTag =~ /^([-_0-9A-Z]+:)*$tryTag$/i and $matched = 1, last;
|
|
3223
|
+
}
|
|
3224
|
+
next if $matched ? $i < @exclude : @tags;
|
|
3225
|
+
}
|
|
3226
|
+
my ($rtn, $wrn) = $et->SetNewValue($csvTag, $$csvInfo{$csvTag},
|
|
3144
3227
|
Protected => 1, AddValue => $csvAdd,
|
|
3145
3228
|
ProtectSaved => $csvSaveCount);
|
|
3146
3229
|
$wrn and Warn "$wrn\n" if $verbose;
|
|
@@ -3607,7 +3690,7 @@ sub EscapeJSON($;$)
|
|
|
3607
3690
|
if ($json < 2) { # JSON
|
|
3608
3691
|
$str =~ tr/\0//d; # remove all nulls
|
|
3609
3692
|
# escape other control characters with \u
|
|
3610
|
-
$str =~ s/([\0-\x1f])/sprintf("\\u%.4X",ord $1)/sge;
|
|
3693
|
+
$str =~ s/([\0-\x1f\x7f])/sprintf("\\u%.4X",ord $1)/sge;
|
|
3611
3694
|
# JSON strings must be valid UTF8
|
|
3612
3695
|
Image::ExifTool::XMP::FixUTF8(\$str) unless $altEnc;
|
|
3613
3696
|
} else { # PHP
|
|
@@ -3615,7 +3698,7 @@ sub EscapeJSON($;$)
|
|
|
3615
3698
|
# must escape "$" too for PHP
|
|
3616
3699
|
$str =~ s/\$/\\\$/sg;
|
|
3617
3700
|
# escape other control characters with \x
|
|
3618
|
-
$str =~ s/([\0-\x1f])/sprintf("\\x%.2X",ord $1)/sge;
|
|
3701
|
+
$str =~ s/([\0-\x1f\x7f])/sprintf("\\x%.2X",ord $1)/sge;
|
|
3619
3702
|
}
|
|
3620
3703
|
return '"' . $str . '"'; # return the quoted string
|
|
3621
3704
|
}
|
|
@@ -3838,17 +3921,23 @@ sub Printable($)
|
|
|
3838
3921
|
sub LengthUTF8($)
|
|
3839
3922
|
{
|
|
3840
3923
|
my $str = shift;
|
|
3924
|
+
return length $str unless $fixLen;
|
|
3925
|
+
local $SIG{'__WARN__'} = sub { };
|
|
3926
|
+
if (not $$mt{OPTIONS}{EncodeHangs} and eval { require Encode }) {
|
|
3927
|
+
$str = Encode::decode_utf8($str);
|
|
3928
|
+
} else {
|
|
3929
|
+
$str = pack('U0C*', unpack 'C*', $str);
|
|
3930
|
+
}
|
|
3841
3931
|
my $len;
|
|
3842
|
-
if (
|
|
3932
|
+
if ($fixLen == 1) {
|
|
3843
3933
|
$len = length $str;
|
|
3844
|
-
} elsif ($fixLen == 1) {
|
|
3845
|
-
$len = length Encode::decode_utf8($str);
|
|
3846
3934
|
} else {
|
|
3847
|
-
my $gcstr = eval { Unicode::GCString->new(
|
|
3935
|
+
my $gcstr = eval { Unicode::GCString->new($str) };
|
|
3848
3936
|
if ($gcstr) {
|
|
3849
3937
|
$len = $gcstr->columns;
|
|
3850
3938
|
} else {
|
|
3851
|
-
$len = length
|
|
3939
|
+
$len = length $str;
|
|
3940
|
+
delete $SIG{'__WARN__'};
|
|
3852
3941
|
Warning($mt, 'Unicode::GCString problem. Columns may be misaligned');
|
|
3853
3942
|
$fixLen = 1;
|
|
3854
3943
|
}
|
|
@@ -3951,6 +4040,19 @@ sub CleanFilename($)
|
|
|
3951
4040
|
$_[0] =~ tr/\\/\// if Image::ExifTool::IsPC();
|
|
3952
4041
|
}
|
|
3953
4042
|
|
|
4043
|
+
#------------------------------------------------------------------------------
|
|
4044
|
+
# Does path name contain wildcards
|
|
4045
|
+
# Inputs: 0) path name
|
|
4046
|
+
# Returns: true if path contains wildcards
|
|
4047
|
+
sub HasWildcards($)
|
|
4048
|
+
{
|
|
4049
|
+
my $path = shift;
|
|
4050
|
+
|
|
4051
|
+
# if this is a Windows path with the long path prefix, then wildcards are not supported
|
|
4052
|
+
return 0 if $^O eq 'MSWin32' and $path =~ m{^[\\/]{2}\?[\\/]};
|
|
4053
|
+
return $path =~ /[*?]/;
|
|
4054
|
+
}
|
|
4055
|
+
|
|
3954
4056
|
#------------------------------------------------------------------------------
|
|
3955
4057
|
# Check for valid UTF-8 of a file name
|
|
3956
4058
|
# Inputs: 0) string, 1) original encoding
|
|
@@ -4071,7 +4173,7 @@ sub ScanDir($$;$)
|
|
|
4071
4173
|
return if $ignore{$dir};
|
|
4072
4174
|
# use Win32::FindFile on Windows if available
|
|
4073
4175
|
# (ReadDir will croak if there is a wildcard, so check for this)
|
|
4074
|
-
if ($^O eq 'MSWin32' and $dir
|
|
4176
|
+
if ($^O eq 'MSWin32' and not HasWildcards($dir)) {
|
|
4075
4177
|
undef $evalWarning;
|
|
4076
4178
|
local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] };;
|
|
4077
4179
|
if (CheckUTF8($dir, $enc) >= 0) {
|
|
@@ -4115,11 +4217,12 @@ sub ScanDir($$;$)
|
|
|
4115
4217
|
}
|
|
4116
4218
|
$dir =~ /\/$/ or $dir .= '/'; # make sure directory name ends with '/'
|
|
4117
4219
|
foreach $file (@fileList) {
|
|
4220
|
+
next if $file eq '.' or $file eq '..';
|
|
4118
4221
|
my $path = "$dir$file";
|
|
4119
4222
|
if ($et->IsDirectory($path)) {
|
|
4120
4223
|
next unless $recurse;
|
|
4121
4224
|
# ignore directories starting with "." by default
|
|
4122
|
-
next if $file =~ /^\./ and
|
|
4225
|
+
next if $file =~ /^\./ and $recurse == 1;
|
|
4123
4226
|
next if $ignore{$file} or ($ignore{SYMLINKS} and -l $path);
|
|
4124
4227
|
ScanDir($et, $path, $list);
|
|
4125
4228
|
last if $end;
|
|
@@ -4197,7 +4300,7 @@ sub FindFileWindows($$)
|
|
|
4197
4300
|
$wildfile = $et->Decode($wildfile, $enc, undef, 'UTF8') if $enc and $enc ne 'UTF8';
|
|
4198
4301
|
$wildfile =~ tr/\\/\//; # use forward slashes
|
|
4199
4302
|
my ($dir, $wildname) = ($wildfile =~ m{(.*[:/])(.*)}) ? ($1, $2) : ('', $wildfile);
|
|
4200
|
-
if ($dir
|
|
4303
|
+
if (HasWildcards($dir)) {
|
|
4201
4304
|
Warn "Wildcards don't work in the directory specification\n";
|
|
4202
4305
|
return ();
|
|
4203
4306
|
}
|
|
@@ -4267,14 +4370,15 @@ sub AbsPath($)
|
|
|
4267
4370
|
{
|
|
4268
4371
|
my $file = shift;
|
|
4269
4372
|
my $path;
|
|
4270
|
-
if (defined $file
|
|
4271
|
-
|
|
4272
|
-
|
|
4273
|
-
|
|
4274
|
-
|
|
4275
|
-
$
|
|
4276
|
-
$path =
|
|
4373
|
+
if (defined $file) {
|
|
4374
|
+
return undef if $file eq '*'; # (CSV SourceFile may be '*' -- no absolute path for that)
|
|
4375
|
+
if ($^O eq 'MSWin32' and $mt->Options('WindowsLongPath')) {
|
|
4376
|
+
$path = $mt->WindowsLongPath($file);
|
|
4377
|
+
} elsif (eval { require Cwd }) {
|
|
4378
|
+
local $SIG{'__WARN__'} = sub { };
|
|
4379
|
+
$path = eval { Cwd::abs_path($file) };
|
|
4277
4380
|
}
|
|
4381
|
+
$path =~ tr/\\/\// if $^O eq 'MSWin32' and defined $path; # use forward slashes
|
|
4278
4382
|
}
|
|
4279
4383
|
return $path;
|
|
4280
4384
|
}
|
|
@@ -4309,7 +4413,7 @@ sub AddPrintFormat($)
|
|
|
4309
4413
|
$printFmt{$type} or $printFmt{$type} = [ ];
|
|
4310
4414
|
push @{$printFmt{$type}}, $expr;
|
|
4311
4415
|
# add to list of requested tags
|
|
4312
|
-
push @requestTags, $expr =~ /\$\{?((?:[
|
|
4416
|
+
push @requestTags, $expr =~ /\$\{?((?:[-_0-9A-Z]+:)*[-_0-9A-Z?*]+)/ig;
|
|
4313
4417
|
$printFmt{SetTags} = 1 if $expr =~ /\bSetTags\b/;
|
|
4314
4418
|
}
|
|
4315
4419
|
|
|
@@ -4664,7 +4768,7 @@ sub FilterArgfileLine($)
|
|
|
4664
4768
|
$arg =~ s/^\s+//; # remove leading white space
|
|
4665
4769
|
$arg =~ s/[\x0d\x0a]+$//s; # remove trailing newline
|
|
4666
4770
|
# remove white space before, and single space after '=', '+=', '-=' or '<='
|
|
4667
|
-
$arg =~ s/^(-[
|
|
4771
|
+
$arg =~ s/^(-[-_0-9A-Z:]+#?)\s*([-+<]?=) ?/$1$2/i;
|
|
4668
4772
|
return undef if $arg eq '';
|
|
4669
4773
|
}
|
|
4670
4774
|
return $arg;
|
|
@@ -5113,7 +5217,7 @@ information. Use the B<-s> option to see the tag names instead.
|
|
|
5113
5217
|
=item B<-->I<TAG>
|
|
5114
5218
|
|
|
5115
5219
|
Exclude specified tag from extracted information. Same as the B<-x> option.
|
|
5116
|
-
Group names and wildcards are permitted as described above for B
|
|
5220
|
+
Group names and wildcards are permitted as described above for B<->I<TAG>.
|
|
5117
5221
|
Once excluded from the output, a tag may not be re-included by a subsequent
|
|
5118
5222
|
option. May also be used following a B<-tagsFromFile> option to exclude
|
|
5119
5223
|
tags from being copied (when redirecting to another tag, it is the source
|
|
@@ -5546,6 +5650,12 @@ option and set the value to "-" in the CSV file (or to the MissingTagValue
|
|
|
5546
5650
|
if this API option was used). Multiple databases may be imported in a
|
|
5547
5651
|
single command.
|
|
5548
5652
|
|
|
5653
|
+
Specific tags may be imported from the CSV database by adding B<->I<TAG>
|
|
5654
|
+
options to the command, or excluded with B<-->I<TAG>, with exclusions taking
|
|
5655
|
+
priority. Group names and wildcards are allowed. If no tags are specified,
|
|
5656
|
+
then all except FileName and Directory are used. Tags are imported in the
|
|
5657
|
+
same order as the database entries.
|
|
5658
|
+
|
|
5549
5659
|
When exporting a CSV file, the B<-g> or B<-G> option adds group names to the
|
|
5550
5660
|
tag headings. If the B<-a> option is used to allow duplicate tag names, the
|
|
5551
5661
|
duplicate tags are only included in the CSV output if the column headings
|
|
@@ -5588,16 +5698,29 @@ in the delimiter. Default is ','.
|
|
|
5588
5698
|
|
|
5589
5699
|
Set the format for date/time tag values. The I<FMT> string may contain
|
|
5590
5700
|
formatting codes beginning with a percent character (C<%>) to represent the
|
|
5591
|
-
various components of a date/time value.
|
|
5592
|
-
|
|
5593
|
-
|
|
5594
|
-
|
|
5595
|
-
|
|
5596
|
-
|
|
5597
|
-
|
|
5598
|
-
|
|
5599
|
-
|
|
5600
|
-
|
|
5701
|
+
various components of a date/time value. ExifTool implements 3 format codes
|
|
5702
|
+
internally (see below), but other format codes are system dependent --
|
|
5703
|
+
consult the C<strftime> man page on your system for details. The default
|
|
5704
|
+
format is equivalent to "%Y:%m:%d %H:%M:%S". This option has no effect on
|
|
5705
|
+
date-only or time-only tags. Requires POSIX::strptime or Time::Piece for
|
|
5706
|
+
the inversion conversion when writing. Only one B<-d> option may be used
|
|
5707
|
+
per command.
|
|
5708
|
+
|
|
5709
|
+
Additional format codes implemented internally by ExifTool:
|
|
5710
|
+
|
|
5711
|
+
1) C<%z> represents the time zone in "+/-HHMM" format. Adding a colon (ie.
|
|
5712
|
+
C<%:z>) adds a colon separator (eg. "-05:00"). If the date/time value
|
|
5713
|
+
doesn't contain a time zone then C<%z> gives the system time zone for the
|
|
5714
|
+
specified date/time value.
|
|
5715
|
+
|
|
5716
|
+
2) C<%f> represents fractional seconds, and supports an optional width to
|
|
5717
|
+
specify the number of digits after the decimal point (eg. C<%3f> would give
|
|
5718
|
+
something like ".437"). Adding a minus sign drops the decimal point (eg.
|
|
5719
|
+
C<%-3f> would give "437").
|
|
5720
|
+
|
|
5721
|
+
3) C<%s> represents the number of seconds since 00:00 UTC Jan 1, 1970,
|
|
5722
|
+
taking into account the specified time zone (or system time zone if not
|
|
5723
|
+
specified).
|
|
5601
5724
|
|
|
5602
5725
|
=item B<-D> (B<-decimal>)
|
|
5603
5726
|
|
|
@@ -5680,18 +5803,28 @@ preserved with the B<-struct> option (this also causes all list-type XMP
|
|
|
5680
5803
|
tags to be output as JSON arrays, otherwise single-item lists would be
|
|
5681
5804
|
output as simple strings). The B<-a> option is implied when B<-json> is
|
|
5682
5805
|
used, but entries with identical JSON names are suppressed in the output.
|
|
5683
|
-
(B<-G4> may be used to ensure that all tags have unique JSON names.)
|
|
5684
|
-
|
|
5685
|
-
|
|
5686
|
-
|
|
5687
|
-
|
|
5688
|
-
|
|
5689
|
-
|
|
5690
|
-
|
|
5691
|
-
|
|
5692
|
-
|
|
5693
|
-
|
|
5694
|
-
|
|
5806
|
+
(B<-G4> may be used to ensure that all tags have unique JSON names.)
|
|
5807
|
+
|
|
5808
|
+
Adding the B<-D> or B<-H> option changes tag values to JSON objects with
|
|
5809
|
+
"val" and "id" fields. Adding B<-l> adds a "desc" field, and a "num" field
|
|
5810
|
+
if the numerical value is different from the converted "val", and "fmt" and
|
|
5811
|
+
"hex" fields for EXIF metadata if the API SaveFormat and SaveBin options are
|
|
5812
|
+
set respectively, and the length of the "hex" output is limited by the API
|
|
5813
|
+
LimitLongValues setting. The B<-b> option may be added to output binary
|
|
5814
|
+
data, encoded in base64 if necessary (indicated by ASCII "base64:" as the
|
|
5815
|
+
first 7 bytes of the value), and B<-t> may be added to include tag table
|
|
5816
|
+
information (see B<-t> for details). The JSON output is UTF-8 regardless of
|
|
5817
|
+
any B<-L> or B<-charset> option setting, but the UTF-8 validation is
|
|
5818
|
+
disabled if a character set other than UTF-8 is specified.
|
|
5819
|
+
|
|
5820
|
+
Note that ExifTool quotes JSON values only if they don't look like numbers
|
|
5821
|
+
(regardless of the original storage format or the relevant metadata
|
|
5822
|
+
specification). This may be a problem when reading the JSON via a strongly
|
|
5823
|
+
typed language. However, the API StructFormat option may be set to "JSONQ"
|
|
5824
|
+
to force quoting of numbers. As well, the B<-sep> option may be used to
|
|
5825
|
+
convert arrays into strings. For example:
|
|
5826
|
+
|
|
5827
|
+
exiftool -j -api structformat=jsonq -sep ", " ...
|
|
5695
5828
|
|
|
5696
5829
|
If I<JSONFILE> is specified, the file is imported and the tag definitions
|
|
5697
5830
|
from the file are used to set tag values on a per-file basis. The special
|
|
@@ -5706,6 +5839,12 @@ or B<-T> is not compatible, and use B<-G> instead of B<-g>). Additionally,
|
|
|
5706
5839
|
tag names in the input JSON file may be suffixed with a C<#> to disable
|
|
5707
5840
|
print conversion.
|
|
5708
5841
|
|
|
5842
|
+
Specific tags may be imported from the JSON database by adding B<->I<TAG>
|
|
5843
|
+
options to the command, or excluded with B<-->I<TAG>, with exclusions taking
|
|
5844
|
+
priority. Group names and wildcards are allowed. If no tags are specified,
|
|
5845
|
+
then all except FileName and Directory are used. Tags are imported in the
|
|
5846
|
+
same order as the database entries.
|
|
5847
|
+
|
|
5709
5848
|
Unlike CSV import, empty values are not ignored, and will cause an empty
|
|
5710
5849
|
value to be written if supported by the specific metadata type. Tags are
|
|
5711
5850
|
deleted by using the B<-f> option and setting the tag value to "-" (or to
|
|
@@ -5845,7 +5984,7 @@ with this command:
|
|
|
5845
5984
|
|
|
5846
5985
|
produces output like this:
|
|
5847
5986
|
|
|
5848
|
-
-- Generated by ExifTool 13.
|
|
5987
|
+
-- Generated by ExifTool 13.17 --
|
|
5849
5988
|
File: a.jpg - 2003:10:31 15:44:19
|
|
5850
5989
|
(f/5.6, 1/60s, ISO 100)
|
|
5851
5990
|
File: b.jpg - 2006:05:23 11:57:38
|
|
@@ -5861,8 +6000,9 @@ name, a value of 1 is returned if any tag exists in the specified group, or
|
|
|
5861
6000
|
0 otherwise (unless the C<All> group is also specified, in which case the
|
|
5862
6001
|
values of all matching tags are joined).
|
|
5863
6002
|
|
|
5864
|
-
|
|
5865
|
-
|
|
6003
|
+
The B<-p> output iterates through the family 3 group names, with each
|
|
6004
|
+
sub-document producing additional output when combined with the B<-ee>
|
|
6005
|
+
(ExtractEmbedded) option.
|
|
5866
6006
|
|
|
5867
6007
|
If a specified tag does not exist, a minor warning is issued and the line
|
|
5868
6008
|
with the missing tag is not printed. However, the B<-f> option may be used
|
|
@@ -5959,7 +6099,8 @@ import). May be combined with B<-s> to print tag names instead of
|
|
|
5959
6099
|
descriptions, or B<-S> to print tag values only, tab-delimited on a single
|
|
5960
6100
|
line. The B<-t> option may be combined with B<-j>, B<-php> or B<-X> to add
|
|
5961
6101
|
tag table information (C<table>, tag C<id>, and C<index> for cases where
|
|
5962
|
-
multiple conditional tags exist with the same ID)
|
|
6102
|
+
multiple conditional tags exist with the same ID), which allows the
|
|
6103
|
+
corresponding tag to be located in the B<-listx> output.
|
|
5963
6104
|
|
|
5964
6105
|
=item B<-T> (B<-table>)
|
|
5965
6106
|
|
|
@@ -6274,7 +6415,8 @@ ExifTool will not scan to the end of a JPEG image to check for an AFCP or
|
|
|
6274
6415
|
PreviewImage trailer, or past the first comment in GIF images or the
|
|
6275
6416
|
audio/video data in WAV/AVI files to search for additional metadata. These
|
|
6276
6417
|
speed benefits are small when reading images directly from disk, but can be
|
|
6277
|
-
substantial if piping images through a network connection.
|
|
6418
|
+
substantial if piping images through a network connection. Also bypasses
|
|
6419
|
+
CRC validation when writing PNG images which can be very slow. For more
|
|
6278
6420
|
substantial speed benefits, B<-fast2> also causes exiftool to avoid
|
|
6279
6421
|
extracting any EXIF MakerNote information, and to stop processing at the
|
|
6280
6422
|
IDAT chunk of PNG images and the mdat atom of QuickTime-format files (but
|
|
@@ -6685,17 +6827,19 @@ names, even if they begin with a dash (C<->).
|
|
|
6685
6827
|
Compare metadata in I<FILE> with I<FILE2>. The I<FILE2> name may include
|
|
6686
6828
|
filename formatting codes (see the B<-w> option). All extracted tags from
|
|
6687
6829
|
the files are compared, but the extracted tags may be controlled by adding
|
|
6688
|
-
B
|
|
6689
|
-
the same-named files in two different directories, ignoring the
|
|
6830
|
+
B<->I<TAG> or B<-->I<TAG> options. For example, below is a command to
|
|
6831
|
+
compare all the same-named files in two different directories, ignoring the
|
|
6832
|
+
System tags:
|
|
6690
6833
|
|
|
6691
6834
|
exiftool DIR1 -diff DIR2/%f.%e --system:all
|
|
6692
6835
|
|
|
6693
6836
|
The B<-g> and B<-G> options may be used to organize the output by the
|
|
6694
6837
|
specified family of groups, with B<-G1> being the default. The B<-a> option
|
|
6695
6838
|
is implied. Adding B<-v> includes a count of the number of tags that are
|
|
6696
|
-
the same in each group
|
|
6697
|
-
|
|
6698
|
-
B<-
|
|
6839
|
+
the same in each group, and B<-v2> also indicates when zero tags were the
|
|
6840
|
+
same. The following text formatting options are valid when B<-diff> is
|
|
6841
|
+
used: B<-c>, B<-charset>, B<-d>, B<-E>, B<-ec>, B<-ex>, B<-L>, B<-lang>,
|
|
6842
|
+
B<-n>, B<-s>, B<-sep>, B<-struct> and B<-w>.
|
|
6699
6843
|
|
|
6700
6844
|
=item B<-geotag> I<TRKFILE>
|
|
6701
6845
|
|
|
@@ -6710,23 +6854,22 @@ the following two commands are equivalent:
|
|
|
6710
6854
|
exiftool -geotag trk.log image.jpg
|
|
6711
6855
|
exiftool -geotag trk.log "-Geotime<DateTimeOriginal#" image.jpg
|
|
6712
6856
|
|
|
6713
|
-
|
|
6714
|
-
|
|
6715
|
-
|
|
6716
|
-
|
|
6717
|
-
|
|
6718
|
-
|
|
6719
|
-
|
|
6720
|
-
|
|
6721
|
-
|
|
6722
|
-
|
|
6723
|
-
|
|
6724
|
-
|
|
6725
|
-
|
|
6726
|
-
|
|
6727
|
-
|
|
6728
|
-
|
|
6729
|
-
order to be written.
|
|
6857
|
+
If the C<Geotime> value does not contain a time zone then the local system
|
|
6858
|
+
timezone is assumed. Writing C<Geotime> causes the following tags to be
|
|
6859
|
+
written (provided they can be calculated from the track log, and they are
|
|
6860
|
+
supported by the destination metadata format): GPSLatitude, GPSLatitudeRef,
|
|
6861
|
+
GPSLongitude, GPSLongitudeRef, GPSAltitude, GPSAltitudeRef, GPSDateStamp,
|
|
6862
|
+
GPSTimeStamp, GPSDateTime, GPSTrack, GPSTrackRef, GPSSpeed, GPSSpeedRef,
|
|
6863
|
+
GPSImgDirection, GPSImgDirectionRef, GPSMeasureMode, GPSDOP, GPSPitch,
|
|
6864
|
+
GPSRoll, GPSCoordinates, AmbientTemperature and CameraElevationAngle. By
|
|
6865
|
+
default, in image files tags are created in EXIF, and updated in XMP only if
|
|
6866
|
+
they already exist. In QuickTime-format files GPSCoordinates is created in
|
|
6867
|
+
the preferred location (ItemList by default) as well as in XMP. However,
|
|
6868
|
+
C<EXIF:Geotime>, C<XMP:Geotime> or C<QuickTime:Geotime> may be specified to
|
|
6869
|
+
write to write only to one group. Also, C<ItemList:Geotime>, C<Keys:Geotime>
|
|
6870
|
+
or C<UserData:Geotime> may be used to write to a specific location in
|
|
6871
|
+
QuickTime-format files. Note that GPSPitch and GPSRoll are non-standard,
|
|
6872
|
+
and require user-defined tags in order to be written.
|
|
6730
6873
|
|
|
6731
6874
|
The C<Geosync> tag may be used to specify a time correction which is applied
|
|
6732
6875
|
to each C<Geotime> value for synchronization with GPS time. For example,
|
|
@@ -7197,13 +7340,13 @@ avoid processing hidden files (provided Win32API::File is available):
|
|
|
7197
7340
|
B<Note>: Beware when cutting and pasting these examples into your terminal!
|
|
7198
7341
|
Some characters such as single and double quotes and hyphens may have been
|
|
7199
7342
|
changed into similar-looking yet functionally-different characters by the
|
|
7200
|
-
text formatter used to display this documentation. Also note that
|
|
7201
|
-
|
|
7202
|
-
|
|
7343
|
+
text formatter used to display this documentation. Also note that in the
|
|
7344
|
+
Windows cmd shell double quotes must be used instead of the single quotes
|
|
7345
|
+
used in the examples.
|
|
7203
7346
|
|
|
7204
7347
|
=over 5
|
|
7205
7348
|
|
|
7206
|
-
=item exiftool -a -u -g1 a.jpg
|
|
7349
|
+
=item C<exiftool -a -u -g1 a.jpg>
|
|
7207
7350
|
|
|
7208
7351
|
Print all meta information in an image, including duplicate and unknown
|
|
7209
7352
|
tags, sorted by group (for family 1). For performance reasons, this command
|
|
@@ -7212,89 +7355,89 @@ metadata extracted by external utilities, and metadata requiring excessive
|
|
|
7212
7355
|
processing time may not be extracted). Add C<-ee3> and C<-api RequestAll=3>
|
|
7213
7356
|
to the command to extract absolutely everything available.
|
|
7214
7357
|
|
|
7215
|
-
=item exiftool -common dir
|
|
7358
|
+
=item C<exiftool -common dir>
|
|
7216
7359
|
|
|
7217
7360
|
Print common meta information for all images in C<dir>. C<-common> is a
|
|
7218
7361
|
L<shortcut tag|Image::ExifTool::Shortcuts> representing common EXIF meta
|
|
7219
7362
|
information.
|
|
7220
7363
|
|
|
7221
|
-
=item exiftool -T -createdate -aperture -shutterspeed -iso dir > out.txt
|
|
7364
|
+
=item C<exiftool -T -createdate -aperture -shutterspeed -iso dir E<gt> out.txt>
|
|
7222
7365
|
|
|
7223
7366
|
List specified meta information in tab-delimited column form for all images
|
|
7224
7367
|
in C<dir> to an output text file named "out.txt".
|
|
7225
7368
|
|
|
7226
|
-
=item exiftool -s -ImageSize -ExposureTime b.jpg
|
|
7369
|
+
=item C<exiftool -s -ImageSize -ExposureTime b.jpg>
|
|
7227
7370
|
|
|
7228
7371
|
Print ImageSize and ExposureTime tag names and values.
|
|
7229
7372
|
|
|
7230
|
-
=item exiftool -l -canon c.jpg d.jpg
|
|
7373
|
+
=item C<exiftool -l -canon c.jpg d.jpg>
|
|
7231
7374
|
|
|
7232
7375
|
Print standard Canon information from two image files.
|
|
7233
7376
|
|
|
7234
|
-
=item exiftool -r -w .txt -common pictures
|
|
7377
|
+
=item C<exiftool -r -w .txt -common pictures>
|
|
7235
7378
|
|
|
7236
7379
|
Recursively extract common meta information from files in C<pictures>
|
|
7237
7380
|
directory, writing text output to C<.txt> files with the same names.
|
|
7238
7381
|
|
|
7239
|
-
=item exiftool -b -ThumbnailImage image.jpg > thumbnail.jpg
|
|
7382
|
+
=item C<exiftool -b -ThumbnailImage image.jpg E<gt> thumbnail.jpg>
|
|
7240
7383
|
|
|
7241
7384
|
Save thumbnail image from C<image.jpg> to a file called C<thumbnail.jpg>.
|
|
7242
7385
|
|
|
7243
|
-
=item exiftool -b -JpgFromRaw -w _JFR.JPG -ext NEF -r
|
|
7386
|
+
=item C<exiftool -b -JpgFromRaw -w _JFR.JPG -ext NEF -r .>
|
|
7244
7387
|
|
|
7245
7388
|
Recursively extract JPG image from all Nikon NEF files in the current
|
|
7246
7389
|
directory, adding C<_JFR.JPG> for the name of the output JPG files.
|
|
7247
7390
|
|
|
7248
|
-
=item exiftool -a -b -W %d%f_%t%-c.%s -preview:all dir
|
|
7391
|
+
=item C<exiftool -a -b -W %d%f_%t%-c.%s -preview:all dir>
|
|
7249
7392
|
|
|
7250
7393
|
Extract all types of preview images (ThumbnailImage, PreviewImage,
|
|
7251
7394
|
JpgFromRaw, etc.) from files in directory "dir", adding the tag name to the
|
|
7252
7395
|
output preview image file names.
|
|
7253
7396
|
|
|
7254
|
-
=item exiftool -d '%r %a, %B %e, %Y' -DateTimeOriginal -S -s -ext jpg
|
|
7397
|
+
=item C<exiftool -d '%r %a, %B %e, %Y' -DateTimeOriginal -S -s -ext jpg .>
|
|
7255
7398
|
|
|
7256
7399
|
Print formatted date/time for all JPG files in the current directory.
|
|
7257
7400
|
|
|
7258
|
-
=item exiftool -IFD1:XResolution -IFD1:YResolution image.jpg
|
|
7401
|
+
=item C<exiftool -IFD1:XResolution -IFD1:YResolution image.jpg>
|
|
7259
7402
|
|
|
7260
7403
|
Extract image resolution from EXIF IFD1 information (thumbnail image IFD).
|
|
7261
7404
|
|
|
7262
|
-
=item exiftool '-*resolution*' image.jpg
|
|
7405
|
+
=item C<exiftool '-*resolution*' image.jpg>
|
|
7263
7406
|
|
|
7264
7407
|
Extract all tags with names containing the word "Resolution" from an image.
|
|
7265
7408
|
|
|
7266
|
-
=item exiftool -xmp:author:all -a image.jpg
|
|
7409
|
+
=item C<exiftool -xmp:author:all -a image.jpg>
|
|
7267
7410
|
|
|
7268
7411
|
Extract all author-related XMP information from an image.
|
|
7269
7412
|
|
|
7270
|
-
=item exiftool -xmp -b a.jpg > out.xmp
|
|
7413
|
+
=item C<exiftool -xmp -b a.jpg E<gt> out.xmp>
|
|
7271
7414
|
|
|
7272
7415
|
Extract complete XMP data record intact from C<a.jpg> and write it to
|
|
7273
7416
|
C<out.xmp> using the special C<XMP> tag (see the Extra tags in
|
|
7274
7417
|
L<Image::ExifTool::TagNames|Image::ExifTool::TagNames>).
|
|
7275
7418
|
|
|
7276
|
-
=item exiftool -p '$filename has date $dateTimeOriginal' -q -f dir
|
|
7419
|
+
=item C<exiftool -p '$filename has date $dateTimeOriginal' -q -f dir>
|
|
7277
7420
|
|
|
7278
7421
|
Print one line of output containing the file name and DateTimeOriginal for
|
|
7279
7422
|
each image in directory C<dir>.
|
|
7280
7423
|
|
|
7281
|
-
=item exiftool -ee3 -p '$gpslatitude, $gpslongitude, $gpstimestamp' a.m2ts
|
|
7424
|
+
=item C<exiftool -ee3 -p '$gpslatitude, $gpslongitude, $gpstimestamp' a.m2ts>
|
|
7282
7425
|
|
|
7283
7426
|
Extract all GPS positions from an AVCHD video.
|
|
7284
7427
|
|
|
7285
|
-
=item exiftool -icc_profile -b -w icc image.jpg
|
|
7428
|
+
=item C<exiftool -icc_profile -b -w icc image.jpg>
|
|
7286
7429
|
|
|
7287
7430
|
Save complete ICC_Profile from an image to an output file with the same name
|
|
7288
7431
|
and an extension of C<.icc>.
|
|
7289
7432
|
|
|
7290
|
-
=item exiftool -htmldump -w tmp/%f_%e.html t/images
|
|
7433
|
+
=item C<exiftool -htmldump -w tmp/%f_%e.html t/images>
|
|
7291
7434
|
|
|
7292
7435
|
Generate HTML pages from a hex dump of EXIF information in all images from
|
|
7293
7436
|
the C<t/images> directory. The output HTML files are written to the C<tmp>
|
|
7294
7437
|
directory (which is created if it didn't exist), with names of the form
|
|
7295
7438
|
'FILENAME_EXT.html'.
|
|
7296
7439
|
|
|
7297
|
-
=item exiftool -a -b -ee -embeddedimage -W Image_%.3g3.%s file.pdf
|
|
7440
|
+
=item C<exiftool -a -b -ee -embeddedimage -W Image_%.3g3.%s file.pdf>
|
|
7298
7441
|
|
|
7299
7442
|
Extract embedded JPG and JP2 images from a PDF file. The output images will
|
|
7300
7443
|
have file names like "Image_#.jpg" or "Image_#.jp2", where "#" is the
|
|
@@ -7312,130 +7455,130 @@ be used (eg. -Comment=E<34>This is a new commentE<34>).
|
|
|
7312
7455
|
|
|
7313
7456
|
=over 5
|
|
7314
7457
|
|
|
7315
|
-
=item exiftool -
|
|
7458
|
+
=item C<exiftool -tagsfromfile src.jpg -exif:all --subifd:all dst.jpg>
|
|
7316
7459
|
|
|
7317
7460
|
Write new comment to a JPG image (replaces any existing comment).
|
|
7318
7461
|
|
|
7319
|
-
=item exiftool -comment= -o newdir -ext jpg
|
|
7462
|
+
=item C<exiftool -comment= -o newdir -ext jpg .>
|
|
7320
7463
|
|
|
7321
7464
|
Remove comment from all JPG images in the current directory, writing the
|
|
7322
7465
|
modified images to a new directory.
|
|
7323
7466
|
|
|
7324
|
-
=item exiftool -keywords=EXIF -keywords=editor dst.jpg
|
|
7467
|
+
=item C<exiftool -keywords=EXIF -keywords=editor dst.jpg>
|
|
7325
7468
|
|
|
7326
7469
|
Replace existing keyword list with two new keywords (C<EXIF> and C<editor>).
|
|
7327
7470
|
|
|
7328
|
-
=item exiftool -Keywords+=word -o newfile.jpg src.jpg
|
|
7471
|
+
=item C<exiftool -Keywords+=word -o newfile.jpg src.jpg>
|
|
7329
7472
|
|
|
7330
7473
|
Copy a source image to a new file, and add a keyword (C<word>) to the
|
|
7331
7474
|
current list of keywords.
|
|
7332
7475
|
|
|
7333
|
-
=item exiftool -exposurecompensation+=-0.5 a.jpg
|
|
7476
|
+
=item C<exiftool -exposurecompensation+=-0.5 a.jpg>
|
|
7334
7477
|
|
|
7335
7478
|
Decrement the value of ExposureCompensation by 0.5 EV. Note that += with a
|
|
7336
7479
|
negative value is used for decrementing because the -= operator is used for
|
|
7337
7480
|
conditional deletion (see next example).
|
|
7338
7481
|
|
|
7339
|
-
=item exiftool -credit-=xxx dir
|
|
7482
|
+
=item C<exiftool -credit-=xxx dir>
|
|
7340
7483
|
|
|
7341
7484
|
Delete Credit information from all files in a directory where the Credit
|
|
7342
7485
|
value was C<xxx>.
|
|
7343
7486
|
|
|
7344
|
-
=item exiftool -xmp:description-de='kühl' -E dst.jpg
|
|
7487
|
+
=item C<exiftool -xmp:description-de='kühl' -E dst.jpg>
|
|
7345
7488
|
|
|
7346
7489
|
Write alternate language for XMP:Description, using HTML character escaping
|
|
7347
7490
|
to input special characters.
|
|
7348
7491
|
|
|
7349
|
-
=item exiftool -all= dst.jpg
|
|
7492
|
+
=item C<exiftool -all= dst.jpg>
|
|
7350
7493
|
|
|
7351
7494
|
Delete all meta information from an image. Note: You should NOT do this to
|
|
7352
7495
|
RAW images (except DNG) since proprietary RAW image formats often contain
|
|
7353
7496
|
information in the makernotes that is necessary for converting the image.
|
|
7354
7497
|
|
|
7355
|
-
=item exiftool -all= -comment='lonely' dst.jpg
|
|
7498
|
+
=item C<exiftool -all= -comment='lonely' dst.jpg>
|
|
7356
7499
|
|
|
7357
7500
|
Delete all meta information from an image and add a comment back in. (Note
|
|
7358
7501
|
that the order is important: C<-comment='lonely' -all=> would also delete
|
|
7359
7502
|
the new comment.)
|
|
7360
7503
|
|
|
7361
|
-
=item exiftool -all= --jfif:all dst.jpg
|
|
7504
|
+
=item C<exiftool -all= --jfif:all dst.jpg>
|
|
7362
7505
|
|
|
7363
7506
|
Delete all meta information except JFIF group from an image.
|
|
7364
7507
|
|
|
7365
|
-
=item exiftool -Photoshop:All= dst.jpg
|
|
7508
|
+
=item C<exiftool -Photoshop:All= dst.jpg>
|
|
7366
7509
|
|
|
7367
7510
|
Delete Photoshop meta information from an image (note that the Photoshop
|
|
7368
7511
|
information also includes IPTC).
|
|
7369
7512
|
|
|
7370
|
-
=item exiftool -r -XMP-crss:all= DIR
|
|
7513
|
+
=item C<exiftool -r -XMP-crss:all= DIR>
|
|
7371
7514
|
|
|
7372
7515
|
Recursively delete all XMP-crss information from images in a directory.
|
|
7373
7516
|
|
|
7374
|
-
=item exiftool '-ThumbnailImageE<lt>=thumb.jpg' dst.jpg
|
|
7517
|
+
=item C<exiftool '-ThumbnailImageE<lt>=thumb.jpg' dst.jpg>
|
|
7375
7518
|
|
|
7376
7519
|
Set the thumbnail image from specified file (Note: The quotes are necessary
|
|
7377
7520
|
to prevent shell redirection).
|
|
7378
7521
|
|
|
7379
|
-
=item exiftool '-JpgFromRawE<lt>=%d%f_JFR.JPG' -ext NEF -r
|
|
7522
|
+
=item C<exiftool '-JpgFromRawE<lt>=%d%f_JFR.JPG' -ext NEF -r .>
|
|
7380
7523
|
|
|
7381
7524
|
Recursively write JPEG images with filenames ending in C<_JFR.JPG> to the
|
|
7382
7525
|
JpgFromRaw tag of like-named files with extension C<.NEF> in the current
|
|
7383
7526
|
directory. (This is the inverse of the C<-JpgFromRaw> command of the
|
|
7384
7527
|
L</READING EXAMPLES> section above.)
|
|
7385
7528
|
|
|
7386
|
-
=item exiftool -DateTimeOriginal-='0:0:0 1:30:0' dir
|
|
7529
|
+
=item C<exiftool -DateTimeOriginal-='0:0:0 1:30:0' dir>
|
|
7387
7530
|
|
|
7388
7531
|
Adjust original date/time of all images in directory C<dir> by subtracting
|
|
7389
7532
|
one hour and 30 minutes. (This is equivalent to C<-DateTimeOriginal-=1.5>.
|
|
7390
7533
|
See L<Image::ExifTool::Shift.pl|Image::ExifTool::Shift.pl> for details.)
|
|
7391
7534
|
|
|
7392
|
-
=item exiftool -createdate+=3 -modifydate+=3 a.jpg b.jpg
|
|
7535
|
+
=item C<exiftool -createdate+=3 -modifydate+=3 a.jpg b.jpg>
|
|
7393
7536
|
|
|
7394
7537
|
Add 3 hours to the CreateDate and ModifyDate timestamps of two images.
|
|
7395
7538
|
|
|
7396
|
-
=item exiftool -AllDates+=1:30 -if '$make eq E<34>CanonE<34>' dir
|
|
7539
|
+
=item C<exiftool -AllDates+=1:30 -if '$make eq E<34>CanonE<34>' dir>
|
|
7397
7540
|
|
|
7398
7541
|
Shift the values of DateTimeOriginal, CreateDate and ModifyDate forward by 1
|
|
7399
7542
|
hour and 30 minutes for all Canon images in a directory. (The AllDates tag
|
|
7400
7543
|
is provided as a shortcut for these three tags, allowing them to be accessed
|
|
7401
7544
|
via a single tag.)
|
|
7402
7545
|
|
|
7403
|
-
=item exiftool -xmp:city=Kingston image1.jpg image2.nef
|
|
7546
|
+
=item C<exiftool -xmp:city=Kingston image1.jpg image2.nef>
|
|
7404
7547
|
|
|
7405
7548
|
Write a tag to the XMP group of two images. (Without the C<xmp:> this tag
|
|
7406
7549
|
would get written to the IPTC group since C<City> exists in both, and IPTC
|
|
7407
7550
|
is preferred by default.)
|
|
7408
7551
|
|
|
7409
|
-
=item exiftool -LightSource-='Unknown (0)' dst.tiff
|
|
7552
|
+
=item C<exiftool -LightSource-='Unknown (0)' dst.tiff>
|
|
7410
7553
|
|
|
7411
7554
|
Delete C<LightSource> tag only if it is unknown with a value of 0.
|
|
7412
7555
|
|
|
7413
|
-
=item exiftool -whitebalance-=auto -WhiteBalance=tung dst.jpg
|
|
7556
|
+
=item C<exiftool -whitebalance-=auto -WhiteBalance=tung dst.jpg>
|
|
7414
7557
|
|
|
7415
7558
|
Set C<WhiteBalance> to C<Tungsten> only if it was previously C<Auto>.
|
|
7416
7559
|
|
|
7417
|
-
=item exiftool -comment-= -comment='new comment' a.jpg
|
|
7560
|
+
=item C<exiftool -comment-= -comment='new comment' a.jpg>
|
|
7418
7561
|
|
|
7419
7562
|
Write a new comment only if the image doesn't have one already.
|
|
7420
7563
|
|
|
7421
|
-
=item exiftool -o %d%f.xmp dir
|
|
7564
|
+
=item C<exiftool -o %d%f.xmp dir>
|
|
7422
7565
|
|
|
7423
7566
|
Create XMP meta information data files for all images in C<dir>.
|
|
7424
7567
|
|
|
7425
|
-
=item exiftool -o test.xmp -owner=Phil -title='XMP File'
|
|
7568
|
+
=item C<exiftool -o test.xmp -owner=Phil -title='XMP File'>
|
|
7426
7569
|
|
|
7427
7570
|
Create an XMP data file only from tags defined on the command line.
|
|
7428
7571
|
|
|
7429
|
-
=item exiftool '-ICC_Profile<=%d%f.icc' image.jpg
|
|
7572
|
+
=item C<exiftool '-ICC_Profile<=%d%f.icc' image.jpg>
|
|
7430
7573
|
|
|
7431
7574
|
Write ICC_Profile to an image from a C<.icc> file of the same name.
|
|
7432
7575
|
|
|
7433
|
-
=item exiftool -hierarchicalkeywords='{keyword=one,children={keyword=B}}'
|
|
7576
|
+
=item C<exiftool -hierarchicalkeywords='{keyword=one,children={keyword=B}}'>
|
|
7434
7577
|
|
|
7435
7578
|
Write structured XMP information. See L<https://exiftool.org/struct.html>
|
|
7436
7579
|
for more details.
|
|
7437
7580
|
|
|
7438
|
-
=item exiftool -trailer:all= image.jpg
|
|
7581
|
+
=item C<exiftool -trailer:all= image.jpg>
|
|
7439
7582
|
|
|
7440
7583
|
Delete any trailer found after the end of image (EOI) in a JPEG file. A
|
|
7441
7584
|
number of digital cameras store a large PreviewImage after the JPEG EOI, and
|
|
@@ -7451,22 +7594,22 @@ These examples demonstrate the ability to copy tag values between files.
|
|
|
7451
7594
|
|
|
7452
7595
|
=over 5
|
|
7453
7596
|
|
|
7454
|
-
=item exiftool -tagsFromFile src.cr2 dst.jpg
|
|
7597
|
+
=item C<exiftool -tagsFromFile src.cr2 dst.jpg>
|
|
7455
7598
|
|
|
7456
7599
|
Copy the values of all writable tags from C<src.cr2> to C<dst.jpg>, writing
|
|
7457
7600
|
the information to same-named tags in the preferred groups.
|
|
7458
7601
|
|
|
7459
|
-
=item exiftool -TagsFromFile src.jpg -all:all dst.jpg
|
|
7602
|
+
=item C<exiftool -TagsFromFile src.jpg -all:all dst.jpg>
|
|
7460
7603
|
|
|
7461
7604
|
Copy the values of all writable tags from C<src.jpg> to C<dst.jpg>,
|
|
7462
7605
|
preserving the original tag groups.
|
|
7463
7606
|
|
|
7464
|
-
=item exiftool -all= -tagsfromfile src.jpg -exif:all dst.jpg
|
|
7607
|
+
=item C<exiftool -all= -tagsfromfile src.jpg -exif:all dst.jpg>
|
|
7465
7608
|
|
|
7466
7609
|
Erase all meta information from C<dst.jpg> image, then copy EXIF tags from
|
|
7467
7610
|
C<src.jpg>.
|
|
7468
7611
|
|
|
7469
|
-
=item exiftool -exif:all= -tagsfromfile @ -all:all -unsafe bad.jpg
|
|
7612
|
+
=item C<exiftool -exif:all= -tagsfromfile @ -all:all -unsafe bad.jpg>
|
|
7470
7613
|
|
|
7471
7614
|
Rebuild all EXIF meta information from scratch in an image. This technique
|
|
7472
7615
|
can be used in JPEG images to repair corrupted EXIF information which
|
|
@@ -7475,7 +7618,7 @@ shortcut for unsafe EXIF tags in JPEG images which are not normally copied.
|
|
|
7475
7618
|
See the L<tag name documentation|Image::ExifTool::TagNames> for more details
|
|
7476
7619
|
about unsafe tags.
|
|
7477
7620
|
|
|
7478
|
-
=item exiftool -Tagsfromfile a.jpg out.xmp
|
|
7621
|
+
=item C<exiftool -Tagsfromfile a.jpg out.xmp>
|
|
7479
7622
|
|
|
7480
7623
|
Copy meta information from C<a.jpg> to an XMP data file. If the XMP data
|
|
7481
7624
|
file C<out.xmp> already exists, it will be updated with the new information.
|
|
@@ -7484,46 +7627,46 @@ be created like this (files containing images may be edited but not
|
|
|
7484
7627
|
created). See L</WRITING EXAMPLES> above for another technique to generate
|
|
7485
7628
|
XMP files.
|
|
7486
7629
|
|
|
7487
|
-
=item exiftool -tagsFromFile a.jpg -XMP:All= -ThumbnailImage= -m b.jpg
|
|
7630
|
+
=item C<exiftool -tagsFromFile a.jpg -XMP:All= -ThumbnailImage= -m b.jpg>
|
|
7488
7631
|
|
|
7489
7632
|
Copy all meta information from C<a.jpg> to C<b.jpg>, deleting all XMP
|
|
7490
7633
|
information and the thumbnail image from the destination.
|
|
7491
7634
|
|
|
7492
|
-
=item exiftool -TagsFromFile src.jpg -title -author=Phil dst.jpg
|
|
7635
|
+
=item C<exiftool -TagsFromFile src.jpg -title -author=Phil dst.jpg>
|
|
7493
7636
|
|
|
7494
7637
|
Copy title from one image to another and set a new author name.
|
|
7495
7638
|
|
|
7496
|
-
=item exiftool -TagsFromFile a.jpg -ISO -TagsFromFile b.jpg -comment
|
|
7497
|
-
dst.jpg
|
|
7639
|
+
=item C<exiftool -TagsFromFile a.jpg -ISO -TagsFromFile b.jpg -comment
|
|
7640
|
+
dst.jpg>
|
|
7498
7641
|
|
|
7499
7642
|
Copy ISO from one image and Comment from another image to a destination
|
|
7500
7643
|
image.
|
|
7501
7644
|
|
|
7502
|
-
=item exiftool -tagsfromfile src.jpg -exif:all --subifd:all dst.jpg
|
|
7645
|
+
=item C<exiftool -tagsfromfile src.jpg -exif:all --subifd:all dst.jpg>
|
|
7503
7646
|
|
|
7504
7647
|
Copy only the EXIF information from one image to another, excluding SubIFD
|
|
7505
7648
|
tags.
|
|
7506
7649
|
|
|
7507
|
-
=item exiftool '-FileModifyDateE<lt>DateTimeOriginal' dir
|
|
7650
|
+
=item C<exiftool '-FileModifyDateE<lt>DateTimeOriginal' dir>
|
|
7508
7651
|
|
|
7509
7652
|
Use the original date from the meta information to set the same file's
|
|
7510
7653
|
filesystem modification date for all images in a directory. (Note that
|
|
7511
7654
|
C<-TagsFromFile @> is assumed if no other B<-TagsFromFile> is specified when
|
|
7512
7655
|
redirecting information as in this example.)
|
|
7513
7656
|
|
|
7514
|
-
=item exiftool -TagsFromFile src.jpg '-xmp:allE<lt>all' dst.jpg
|
|
7657
|
+
=item C<exiftool -TagsFromFile src.jpg '-xmp:allE<lt>all' dst.jpg>
|
|
7515
7658
|
|
|
7516
7659
|
Copy all possible information from C<src.jpg> and write in XMP format to
|
|
7517
7660
|
C<dst.jpg>.
|
|
7518
7661
|
|
|
7519
|
-
=item exiftool '-Description<${FileName;s/\.[^.]*$//}' dir
|
|
7662
|
+
=item C<exiftool '-Description<${FileName;s/\.[^.]*$//}' dir>
|
|
7520
7663
|
|
|
7521
7664
|
Set the image Description from the file name after removing the extension.
|
|
7522
7665
|
This example uses the L</Advanced formatting feature> to perform a
|
|
7523
7666
|
substitution operation to remove the last dot and subsequent characters from
|
|
7524
7667
|
the file name.
|
|
7525
7668
|
|
|
7526
|
-
=item exiftool -@ iptc2xmp.args -iptc:all= a.jpg
|
|
7669
|
+
=item C<exiftool -@ iptc2xmp.args -iptc:all= a.jpg>
|
|
7527
7670
|
|
|
7528
7671
|
Translate IPTC information to XMP with appropriate tag name conversions, and
|
|
7529
7672
|
delete the original IPTC information from an image. This example uses
|
|
@@ -7533,40 +7676,40 @@ Also included with the distribution are xmp2iptc.args (which performs the
|
|
|
7533
7676
|
inverse conversion) and a few more .args files for other conversions between
|
|
7534
7677
|
EXIF, IPTC and XMP.
|
|
7535
7678
|
|
|
7536
|
-
=item exiftool -tagsfromfile %d%f.CR2 -r -ext JPG dir
|
|
7679
|
+
=item C<exiftool -tagsfromfile %d%f.CR2 -r -ext JPG dir>
|
|
7537
7680
|
|
|
7538
7681
|
Recursively rewrite all C<JPG> images in C<dir> with information copied from
|
|
7539
7682
|
the corresponding C<CR2> images in the same directories.
|
|
7540
7683
|
|
|
7541
|
-
=item exiftool '-keywords+E<lt>make' image.jpg
|
|
7684
|
+
=item C<exiftool '-keywords+E<lt>make' image.jpg>
|
|
7542
7685
|
|
|
7543
7686
|
Add camera make to list of keywords.
|
|
7544
7687
|
|
|
7545
|
-
=item exiftool '-commentE<lt>ISO=$exif:iso Exposure=${shutterspeed}' dir
|
|
7688
|
+
=item C<exiftool '-commentE<lt>ISO=$exif:iso Exposure=${shutterspeed}' dir>
|
|
7546
7689
|
|
|
7547
7690
|
Set the Comment tag of all images in C<dir> from the values of the EXIF:ISO
|
|
7548
7691
|
and ShutterSpeed tags. The resulting comment will be in the form "ISO=100
|
|
7549
7692
|
Exposure=1/60".
|
|
7550
7693
|
|
|
7551
|
-
=item exiftool -TagsFromFile src.jpg -icc_profile dst.jpg
|
|
7694
|
+
=item C<exiftool -TagsFromFile src.jpg -icc_profile dst.jpg>
|
|
7552
7695
|
|
|
7553
7696
|
Copy ICC_Profile from one image to another.
|
|
7554
7697
|
|
|
7555
|
-
=item exiftool -TagsFromFile src.jpg -all:all dst.mie
|
|
7698
|
+
=item C<exiftool -TagsFromFile src.jpg -all:all dst.mie>
|
|
7556
7699
|
|
|
7557
7700
|
Copy all meta information in its original form from a JPEG image to a MIE
|
|
7558
7701
|
file. The MIE file will be created if it doesn't exist. This technique can
|
|
7559
7702
|
be used to store the metadata of an image so it can be inserted back into
|
|
7560
7703
|
the image (with the inverse command) later in a workflow.
|
|
7561
7704
|
|
|
7562
|
-
=item exiftool -o dst.mie -all:all src.jpg
|
|
7705
|
+
=item C<exiftool -o dst.mie -all:all src.jpg>
|
|
7563
7706
|
|
|
7564
7707
|
This command performs exactly the same task as the command above, except
|
|
7565
7708
|
that the B<-o> option will not write to an output file that already exists.
|
|
7566
7709
|
|
|
7567
|
-
=item exiftool -b -jpgfromraw -w %d%f_%ue.jpg -execute -b -previewimage -w
|
|
7710
|
+
=item C<exiftool -b -jpgfromraw -w %d%f_%ue.jpg -execute -b -previewimage -w
|
|
7568
7711
|
%d%f_%ue.jpg -execute -tagsfromfile @ -srcfile %d%f_%ue.jpg
|
|
7569
|
-
-overwrite_original -common_args --ext jpg DIR
|
|
7712
|
+
-overwrite_original -common_args --ext jpg DIR>
|
|
7570
7713
|
|
|
7571
7714
|
[Advanced] Extract JpgFromRaw or PreviewImage from all but JPG files in DIR,
|
|
7572
7715
|
saving them with file names like C<image_EXT.jpg>, then add all meta
|
|
@@ -7599,34 +7742,34 @@ examples.
|
|
|
7599
7742
|
|
|
7600
7743
|
=over 5
|
|
7601
7744
|
|
|
7602
|
-
=item exiftool -filename=new.jpg dir/old.jpg
|
|
7745
|
+
=item C<exiftool -filename=new.jpg dir/old.jpg>
|
|
7603
7746
|
|
|
7604
7747
|
Rename C<old.jpg> to C<new.jpg> in directory C<dir>.
|
|
7605
7748
|
|
|
7606
|
-
=item exiftool -directory=%e dir
|
|
7749
|
+
=item C<exiftool -directory=%e dir>
|
|
7607
7750
|
|
|
7608
7751
|
Move all files from directory C<dir> into directories named by the original
|
|
7609
7752
|
file extensions.
|
|
7610
7753
|
|
|
7611
|
-
=item exiftool '-
|
|
7754
|
+
=item C<exiftool '-DirectoryE<lt>DateTimeOriginal' -d %Y/%m/%d dir>
|
|
7612
7755
|
|
|
7613
7756
|
Move all files in C<dir> into a directory hierarchy based on year, month and
|
|
7614
7757
|
day of C<DateTimeOriginal>. eg) This command would move the file
|
|
7615
7758
|
C<dir/image.jpg> with a C<DateTimeOriginal> of C<2005:10:12 16:05:56> to
|
|
7616
7759
|
C<2005/10/12/image.jpg>.
|
|
7617
7760
|
|
|
7618
|
-
=item exiftool -o . '-
|
|
7761
|
+
=item C<exiftool -o . '-DirectoryE<lt>DateTimeOriginal' -d %Y/%m/%d dir>
|
|
7619
7762
|
|
|
7620
7763
|
Same effect as above except files are copied instead of moved.
|
|
7621
7764
|
|
|
7622
|
-
=item exiftool '-
|
|
7765
|
+
=item C<exiftool '-filenameE<lt>%f_${model;}.%e' dir>
|
|
7623
7766
|
|
|
7624
7767
|
Rename all files in C<dir> by adding the camera model name to the file name.
|
|
7625
7768
|
The semicolon after the tag name inside the braces causes characters which
|
|
7626
7769
|
are invalid in Windows file names to be deleted from the tag value (see the
|
|
7627
7770
|
L</Advanced formatting feature> for an explanation).
|
|
7628
7771
|
|
|
7629
|
-
=item exiftool '-
|
|
7772
|
+
=item C<exiftool '-FileNameE<lt>CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir>
|
|
7630
7773
|
|
|
7631
7774
|
Rename all images in C<dir> according to the C<CreateDate> date and time,
|
|
7632
7775
|
adding a copy number with leading '-' if the file already exists (C<%-c>),
|
|
@@ -7634,7 +7777,7 @@ and preserving the original file extension (C<%e>). Note the extra '%'
|
|
|
7634
7777
|
necessary to escape the filename codes (C<%c> and C<%e>) in the date format
|
|
7635
7778
|
string.
|
|
7636
7779
|
|
|
7637
|
-
=item exiftool -r '-
|
|
7780
|
+
=item C<exiftool -r '-FileNameE<lt>CreateDate' -d %Y-%m-%d/%H%M_%%f.%%e dir>
|
|
7638
7781
|
|
|
7639
7782
|
Both the directory and the filename may be changed together via the
|
|
7640
7783
|
C<FileName> tag if the new C<FileName> contains a '/'. The example above
|
|
@@ -7642,7 +7785,7 @@ recursively renames all images in a directory by adding a C<CreateDate>
|
|
|
7642
7785
|
timestamp to the start of the filename, then moves them into new directories
|
|
7643
7786
|
named by date.
|
|
7644
7787
|
|
|
7645
|
-
=item exiftool '-
|
|
7788
|
+
=item C<exiftool '-FileNameE<lt>${CreateDate}_$filenumber.jpg' -d %Y%m%d -ext jpg .>
|
|
7646
7789
|
|
|
7647
7790
|
Set the filename of all JPG images in the current directory from the
|
|
7648
7791
|
CreateDate and FileNumber tags, in the form "20060507_118-1861.jpg".
|
|
@@ -7661,67 +7804,67 @@ the B<-geotag> option.)
|
|
|
7661
7804
|
|
|
7662
7805
|
=over 5
|
|
7663
7806
|
|
|
7664
|
-
=item exiftool -geotag track.log a.jpg
|
|
7807
|
+
=item C<exiftool -geotag track.log a.jpg>
|
|
7665
7808
|
|
|
7666
7809
|
Geotag an image (C<a.jpg>) from position information in a GPS track log
|
|
7667
7810
|
(C<track.log>). Since the C<Geotime> tag is not specified, the value of
|
|
7668
7811
|
DateTimeOriginal is used for geotagging. Local system time is assumed
|
|
7669
7812
|
unless DateTimeOriginal contains a timezone.
|
|
7670
7813
|
|
|
7671
|
-
=item exiftool -geotag track.log -geolocate=geotag a.jpg
|
|
7814
|
+
=item C<exiftool -geotag track.log -geolocate=geotag a.jpg>
|
|
7672
7815
|
|
|
7673
7816
|
Geotag an image and also write geolocation information of the nearest city
|
|
7674
7817
|
(city name, state/province and country). Read here for more details about
|
|
7675
7818
|
the Geolocation feature: L<https://exiftool.org/geolocation.html#Write>
|
|
7676
7819
|
|
|
7677
|
-
=item exiftool -geotag t.log -geotime='2009:04:02 13:41:12-05:00' a.jpg
|
|
7820
|
+
=item C<exiftool -geotag t.log -geotime='2009:04:02 13:41:12-05:00' a.jpg>
|
|
7678
7821
|
|
|
7679
7822
|
Geotag an image with the GPS position for a specific time.
|
|
7680
7823
|
|
|
7681
|
-
=item exiftool -geotag log.gpx '-xmp:geotimeE<lt>createdate' dir
|
|
7824
|
+
=item C<exiftool -geotag log.gpx '-xmp:geotimeE<lt>createdate' dir>
|
|
7682
7825
|
|
|
7683
7826
|
Geotag all images in directory C<dir> with XMP tags instead of EXIF tags,
|
|
7684
7827
|
based on the image CreateDate.
|
|
7685
7828
|
|
|
7686
|
-
=item exiftool -geotag a.log -geosync=-20 dir
|
|
7829
|
+
=item C<exiftool -geotag a.log -geosync=-20 dir>
|
|
7687
7830
|
|
|
7688
7831
|
Geotag images in directory C<dir>, accounting for image timestamps which
|
|
7689
7832
|
were 20 seconds ahead of GPS.
|
|
7690
7833
|
|
|
7691
|
-
=item exiftool -geotag a.log -geosync=1.jpg -geosync=2.jpg dir
|
|
7834
|
+
=item C<exiftool -geotag a.log -geosync=1.jpg -geosync=2.jpg dir>
|
|
7692
7835
|
|
|
7693
7836
|
Geotag images using time synchronization from two previously geotagged images
|
|
7694
7837
|
(1.jpg and 2.jpg), synchronizing the image and GPS times using a linear time
|
|
7695
7838
|
drift correction.
|
|
7696
7839
|
|
|
7697
|
-
=item exiftool -geotag a.log '-geotimeE<lt>${createdate}+01:00' dir
|
|
7840
|
+
=item C<exiftool -geotag a.log '-geotimeE<lt>${createdate}+01:00' dir>
|
|
7698
7841
|
|
|
7699
7842
|
Geotag images in C<dir> using CreateDate with the specified timezone. If
|
|
7700
7843
|
CreateDate already contained a timezone, then the timezone specified on the
|
|
7701
7844
|
command line is ignored.
|
|
7702
7845
|
|
|
7703
|
-
=item exiftool -geotag= a.jpg
|
|
7846
|
+
=item C<exiftool -geotag= a.jpg>
|
|
7704
7847
|
|
|
7705
7848
|
Delete GPS tags which may have been added by the geotag feature. Note that
|
|
7706
7849
|
this does not remove all GPS tags -- to do this instead use C<-gps:all=>.
|
|
7707
7850
|
|
|
7708
|
-
=item exiftool -xmp:geotag= a.jpg
|
|
7851
|
+
=item C<exiftool -xmp:geotag= a.jpg>
|
|
7709
7852
|
|
|
7710
7853
|
Delete XMP GPS tags which were added by the geotag feature.
|
|
7711
7854
|
|
|
7712
|
-
=item exiftool -xmp:geotag=track.log a.jpg
|
|
7855
|
+
=item C<exiftool -xmp:geotag=track.log a.jpg>
|
|
7713
7856
|
|
|
7714
7857
|
Geotag an image with XMP tags, using the time from DateTimeOriginal.
|
|
7715
7858
|
|
|
7716
|
-
=item exiftool -geotag a.log -geotag b.log -r dir
|
|
7859
|
+
=item C<exiftool -geotag a.log -geotag b.log -r dir>
|
|
7717
7860
|
|
|
7718
7861
|
Combine multiple track logs and geotag an entire directory tree of images.
|
|
7719
7862
|
|
|
7720
|
-
=item exiftool -geotag 'tracks/*.log' -r dir
|
|
7863
|
+
=item C<exiftool -geotag 'tracks/*.log' -r dir>
|
|
7721
7864
|
|
|
7722
7865
|
Read all track logs from the C<tracks> directory.
|
|
7723
7866
|
|
|
7724
|
-
=item exiftool -p gpx.fmt dir > out.gpx
|
|
7867
|
+
=item C<exiftool -p gpx.fmt dir E<gt> out.gpx>
|
|
7725
7868
|
|
|
7726
7869
|
Generate a GPX track log from all images in directory C<dir>. This example
|
|
7727
7870
|
uses the C<gpx.fmt> file included in the full ExifTool distribution package
|
|
@@ -7733,26 +7876,26 @@ and assumes that the images in C<dir> have all been previously geotagged.
|
|
|
7733
7876
|
|
|
7734
7877
|
=over 5
|
|
7735
7878
|
|
|
7736
|
-
=item cat a.jpg | exiftool
|
|
7879
|
+
=item C<cat a.jpg | exiftool ->
|
|
7737
7880
|
|
|
7738
7881
|
Extract information from stdin.
|
|
7739
7882
|
|
|
7740
|
-
=item exiftool image.jpg -thumbnailimage -b | exiftool
|
|
7883
|
+
=item C<exiftool image.jpg -thumbnailimage -b | exiftool ->
|
|
7741
7884
|
|
|
7742
7885
|
Extract information from an embedded thumbnail image.
|
|
7743
7886
|
|
|
7744
|
-
=item cat a.jpg | exiftool -iptc:keywords+=fantastic - > b.jpg
|
|
7887
|
+
=item C<cat a.jpg | exiftool -iptc:keywords+=fantastic - E<gt> b.jpg>
|
|
7745
7888
|
|
|
7746
7889
|
Add an IPTC keyword in a pipeline, saving output to a new file.
|
|
7747
7890
|
|
|
7748
|
-
=item curl -s http://a.domain.com/bigfile.jpg | exiftool -fast
|
|
7891
|
+
=item C<curl -s http://a.domain.com/bigfile.jpg | exiftool -fast ->
|
|
7749
7892
|
|
|
7750
7893
|
Extract information from an image over the internet using the cURL utility.
|
|
7751
7894
|
The B<-fast> option prevents exiftool from scanning for trailer information,
|
|
7752
7895
|
so only the meta information header is transferred.
|
|
7753
7896
|
|
|
7754
|
-
=item exiftool a.jpg -thumbnailimage -b | exiftool -comment=wow - |
|
|
7755
|
-
exiftool a.jpg -thumbnailimage'
|
|
7897
|
+
=item C<exiftool a.jpg -thumbnailimage -b | exiftool -comment=wow - |
|
|
7898
|
+
exiftool a.jpg -thumbnailimage'E<lt>=-'>
|
|
7756
7899
|
|
|
7757
7900
|
Add a comment to an embedded thumbnail image. (Why anyone would want to do
|
|
7758
7901
|
this I don't know, but I've included this as an example to illustrate the
|
|
@@ -7775,7 +7918,7 @@ the commands if B<-execute> was used).
|
|
|
7775
7918
|
|
|
7776
7919
|
=head1 AUTHOR
|
|
7777
7920
|
|
|
7778
|
-
Copyright 2003-
|
|
7921
|
+
Copyright 2003-2025, Phil Harvey
|
|
7779
7922
|
|
|
7780
7923
|
This is free software; you can redistribute it and/or modify it under the
|
|
7781
7924
|
same terms as Perl itself.
|