exiftool-vendored.pl 13.0.1 → 13.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/bin/Changes +254 -20
  2. package/bin/MANIFEST +10 -0
  3. package/bin/META.json +1 -1
  4. package/bin/META.yml +1 -1
  5. package/bin/README +3 -3
  6. package/bin/arg_files/exif2xmp.args +4 -0
  7. package/bin/arg_files/xmp2exif.args +2 -1
  8. package/bin/build_geolocation +1 -1
  9. package/bin/exiftool +356 -213
  10. package/bin/lib/File/RandomAccess.pm +1 -1
  11. package/bin/lib/File/RandomAccess.pod +2 -2
  12. package/bin/lib/Image/ExifTool/AAC.pm +1 -1
  13. package/bin/lib/Image/ExifTool/AES.pm +1 -1
  14. package/bin/lib/Image/ExifTool/AFCP.pm +6 -6
  15. package/bin/lib/Image/ExifTool/AIFF.pm +2 -2
  16. package/bin/lib/Image/ExifTool/APE.pm +2 -2
  17. package/bin/lib/Image/ExifTool/APP12.pm +1 -1
  18. package/bin/lib/Image/ExifTool/ASF.pm +2 -2
  19. package/bin/lib/Image/ExifTool/Apple.pm +11 -9
  20. package/bin/lib/Image/ExifTool/Audible.pm +1 -1
  21. package/bin/lib/Image/ExifTool/BMP.pm +1 -1
  22. package/bin/lib/Image/ExifTool/BPG.pm +1 -1
  23. package/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  24. package/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
  25. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +36 -22
  26. package/bin/lib/Image/ExifTool/CBOR.pm +5 -2
  27. package/bin/lib/Image/ExifTool/Canon.pm +66 -27
  28. package/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
  29. package/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  30. package/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
  31. package/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  32. package/bin/lib/Image/ExifTool/Casio.pm +1 -1
  33. package/bin/lib/Image/ExifTool/Charset.pm +1 -1
  34. package/bin/lib/Image/ExifTool/DICOM.pm +1 -1
  35. package/bin/lib/Image/ExifTool/DJI.pm +196 -30
  36. package/bin/lib/Image/ExifTool/DNG.pm +1 -1
  37. package/bin/lib/Image/ExifTool/DPX.pm +1 -1
  38. package/bin/lib/Image/ExifTool/DV.pm +1 -1
  39. package/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
  40. package/bin/lib/Image/ExifTool/DjVu.pm +1 -1
  41. package/bin/lib/Image/ExifTool/EXE.pm +138 -33
  42. package/bin/lib/Image/ExifTool/Exif.pm +29 -16
  43. package/bin/lib/Image/ExifTool/FITS.pm +3 -3
  44. package/bin/lib/Image/ExifTool/FLAC.pm +1 -1
  45. package/bin/lib/Image/ExifTool/FLIF.pm +3 -3
  46. package/bin/lib/Image/ExifTool/FLIR.pm +1 -1
  47. package/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  48. package/bin/lib/Image/ExifTool/Flash.pm +1 -1
  49. package/bin/lib/Image/ExifTool/FlashPix.pm +17 -21
  50. package/bin/lib/Image/ExifTool/Font.pm +2 -2
  51. package/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  52. package/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
  53. package/bin/lib/Image/ExifTool/GE.pm +1 -1
  54. package/bin/lib/Image/ExifTool/GIF.pm +144 -93
  55. package/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  56. package/bin/lib/Image/ExifTool/GM.pm +1 -1
  57. package/bin/lib/Image/ExifTool/GPS.pm +34 -30
  58. package/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
  59. package/bin/lib/Image/ExifTool/Geolocation.dat +0 -0
  60. package/bin/lib/Image/ExifTool/Geolocation.pm +19 -9
  61. package/bin/lib/Image/ExifTool/Geotag.pm +46 -12
  62. package/bin/lib/Image/ExifTool/GoPro.pm +120 -8
  63. package/bin/lib/Image/ExifTool/H264.pm +1 -1
  64. package/bin/lib/Image/ExifTool/HP.pm +2 -2
  65. package/bin/lib/Image/ExifTool/HTML.pm +1 -1
  66. package/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
  67. package/bin/lib/Image/ExifTool/ICC_Profile.pm +81 -2
  68. package/bin/lib/Image/ExifTool/ICO.pm +1 -1
  69. package/bin/lib/Image/ExifTool/ID3.pm +8 -8
  70. package/bin/lib/Image/ExifTool/IPTC.pm +10 -7
  71. package/bin/lib/Image/ExifTool/ISO.pm +1 -1
  72. package/bin/lib/Image/ExifTool/ITC.pm +1 -1
  73. package/bin/lib/Image/ExifTool/Import.pm +5 -4
  74. package/bin/lib/Image/ExifTool/InDesign.pm +2 -2
  75. package/bin/lib/Image/ExifTool/InfiRay.pm +1 -1
  76. package/bin/lib/Image/ExifTool/JPEG.pm +32 -5
  77. package/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  78. package/bin/lib/Image/ExifTool/JSON.pm +1 -1
  79. package/bin/lib/Image/ExifTool/JVC.pm +1 -1
  80. package/bin/lib/Image/ExifTool/Jpeg2000.pm +10 -9
  81. package/bin/lib/Image/ExifTool/Kodak.pm +1 -1
  82. package/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  83. package/bin/lib/Image/ExifTool/LIF.pm +1 -1
  84. package/bin/lib/Image/ExifTool/LNK.pm +2 -2
  85. package/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  86. package/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  87. package/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  88. package/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  89. package/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  90. package/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
  91. package/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
  92. package/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
  93. package/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
  94. package/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
  95. package/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
  96. package/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
  97. package/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  98. package/bin/lib/Image/ExifTool/Lang/sk.pm +1 -1
  99. package/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  100. package/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
  101. package/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  102. package/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  103. package/bin/lib/Image/ExifTool/Leaf.pm +1 -1
  104. package/bin/lib/Image/ExifTool/LigoGPS.pm +409 -0
  105. package/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  106. package/bin/lib/Image/ExifTool/M2TS.pm +57 -18
  107. package/bin/lib/Image/ExifTool/MIE.pm +15 -6
  108. package/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  109. package/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  110. package/bin/lib/Image/ExifTool/MISB.pm +1 -1
  111. package/bin/lib/Image/ExifTool/MNG.pm +1 -1
  112. package/bin/lib/Image/ExifTool/MOI.pm +1 -1
  113. package/bin/lib/Image/ExifTool/MPC.pm +1 -1
  114. package/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  115. package/bin/lib/Image/ExifTool/MPF.pm +1 -1
  116. package/bin/lib/Image/ExifTool/MRC.pm +1 -1
  117. package/bin/lib/Image/ExifTool/MWG.pm +1 -1
  118. package/bin/lib/Image/ExifTool/MXF.pm +3 -3
  119. package/bin/lib/Image/ExifTool/MacOS.pm +3 -2
  120. package/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
  121. package/bin/lib/Image/ExifTool/Matroska.pm +22 -6
  122. package/bin/lib/Image/ExifTool/Microsoft.pm +2 -2
  123. package/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  124. package/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  125. package/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  126. package/bin/lib/Image/ExifTool/Nikon.pm +495 -39
  127. package/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  128. package/bin/lib/Image/ExifTool/NikonCustom.pm +2 -2
  129. package/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
  130. package/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  131. package/bin/lib/Image/ExifTool/OOXML.pm +8 -8
  132. package/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  133. package/bin/lib/Image/ExifTool/Olympus.pm +1 -1
  134. package/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
  135. package/bin/lib/Image/ExifTool/Opus.pm +1 -1
  136. package/bin/lib/Image/ExifTool/Other.pm +1 -1
  137. package/bin/lib/Image/ExifTool/PCX.pm +1 -1
  138. package/bin/lib/Image/ExifTool/PDF.pm +49 -18
  139. package/bin/lib/Image/ExifTool/PGF.pm +1 -1
  140. package/bin/lib/Image/ExifTool/PICT.pm +1 -1
  141. package/bin/lib/Image/ExifTool/PLIST.pm +4 -4
  142. package/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  143. package/bin/lib/Image/ExifTool/PNG.pm +20 -8
  144. package/bin/lib/Image/ExifTool/PPM.pm +12 -3
  145. package/bin/lib/Image/ExifTool/PSP.pm +1 -1
  146. package/bin/lib/Image/ExifTool/Palm.pm +1 -1
  147. package/bin/lib/Image/ExifTool/Panasonic.pm +27 -3
  148. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  149. package/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  150. package/bin/lib/Image/ExifTool/Pentax.pm +1 -1
  151. package/bin/lib/Image/ExifTool/PhaseOne.pm +4 -4
  152. package/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  153. package/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  154. package/bin/lib/Image/ExifTool/Photoshop.pm +65 -4
  155. package/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  156. package/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  157. package/bin/lib/Image/ExifTool/Protobuf.pm +270 -0
  158. package/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  159. package/bin/lib/Image/ExifTool/QuickTime.pm +326 -88
  160. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +199 -195
  161. package/bin/lib/Image/ExifTool/README +12 -2
  162. package/bin/lib/Image/ExifTool/RIFF.pm +21 -6
  163. package/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  164. package/bin/lib/Image/ExifTool/RTF.pm +2 -2
  165. package/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  166. package/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  167. package/bin/lib/Image/ExifTool/Real.pm +1 -1
  168. package/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  169. package/bin/lib/Image/ExifTool/Red.pm +1 -1
  170. package/bin/lib/Image/ExifTool/Ricoh.pm +4 -4
  171. package/bin/lib/Image/ExifTool/Samsung.pm +2 -2
  172. package/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  173. package/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  174. package/bin/lib/Image/ExifTool/Shift.pl +1 -1
  175. package/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
  176. package/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  177. package/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  178. package/bin/lib/Image/ExifTool/Sony.pm +5 -4
  179. package/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  180. package/bin/lib/Image/ExifTool/Stim.pm +1 -1
  181. package/bin/lib/Image/ExifTool/TagInfoXML.pm +6 -5
  182. package/bin/lib/Image/ExifTool/TagLookup.pm +7023 -6968
  183. package/bin/lib/Image/ExifTool/TagNames.pod +445 -29
  184. package/bin/lib/Image/ExifTool/Text.pm +4 -3
  185. package/bin/lib/Image/ExifTool/Theora.pm +1 -1
  186. package/bin/lib/Image/ExifTool/Torrent.pm +3 -3
  187. package/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  188. package/bin/lib/Image/ExifTool/VCard.pm +3 -3
  189. package/bin/lib/Image/ExifTool/Validate.pm +6 -6
  190. package/bin/lib/Image/ExifTool/Vivo.pm +124 -0
  191. package/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  192. package/bin/lib/Image/ExifTool/WPG.pm +1 -1
  193. package/bin/lib/Image/ExifTool/WTV.pm +1 -1
  194. package/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  195. package/bin/lib/Image/ExifTool/WriteExif.pl +3 -3
  196. package/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  197. package/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  198. package/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
  199. package/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  200. package/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  201. package/bin/lib/Image/ExifTool/WriteQuickTime.pl +166 -79
  202. package/bin/lib/Image/ExifTool/WriteRIFF.pl +17 -6
  203. package/bin/lib/Image/ExifTool/WriteXMP.pl +3 -3
  204. package/bin/lib/Image/ExifTool/Writer.pl +89 -96
  205. package/bin/lib/Image/ExifTool/XISF.pm +1 -1
  206. package/bin/lib/Image/ExifTool/XMP.pm +28 -13
  207. package/bin/lib/Image/ExifTool/XMP2.pl +103 -1
  208. package/bin/lib/Image/ExifTool/XMPStruct.pl +2 -3
  209. package/bin/lib/Image/ExifTool/ZIP.pm +2 -2
  210. package/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  211. package/bin/lib/Image/ExifTool/iWork.pm +1 -1
  212. package/bin/lib/Image/ExifTool.pm +335 -163
  213. package/bin/lib/Image/ExifTool.pod +119 -73
  214. package/bin/perl-Image-ExifTool.spec +1 -1
  215. package/bin/windows_exiftool.txt +96 -51
  216. 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.00';
14
+ my $version = '13.16';
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 =~ /\$\{?((?:[-\w]+:)*[-\w?*]+)/g;
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 (/^([-\w]+:)*(filename|directory|testname)\b/i) {
1385
+ } elsif (/^([-_0-9A-Z]+:)*(filename|directory|testname)\b/i) {
1381
1386
  $doSetFileName = 1;
1382
- } elsif (/^([-\w]+:)*(geotag|geotime|geosync|geolocate)\b/i) {
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 (/^([-\w]+:)*(filename|directory|testname)\b/i) {
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 (/^([-\w]+:)*geotime\b/i) {
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 (/^([-\w*]+:)*([-\w*?]+)#?$/) {
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
+ undef $json; # (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
- foreach (@exclude) {
1761
- $mt->SetNewValue($_, undef, Replace => 2);
1762
- $needSave = 1;
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' and eval { require Encode }) {
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 '${_}' (non-existent file)\n";
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
- undef $info if $verbose or defined $fastCondition or defined $diff;
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
- # get matching tag key from diff file
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
- $name = $et->GetDescription($tag) if $outFormat < 1;
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 (defined $val2 and IsEqual($val, $val2)) {
2443
+ if ($equal) {
2412
2444
  ++$same;
2413
2445
  } else {
2414
- my $len = LengthUTF8($name);
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, $name, $pad, Printable($val);
2451
+ push @diffs, sprintf "< %s %s%s: %s\n", $grp, $desc, $pad, Printable($val);
2420
2452
  if (defined $val2) {
2421
- $grp = ' ' x length($grp), $name = ' ' x $len if $v < 3;
2422
- push @diffs, sprintf "> %s %s%s: %s\n", $grp, $name, $pad, Printable($val2);
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", $name, $pad, Printable($val);
2426
- $name = ' ' x $len if $v < 3;
2427
- push @diffs, sprintf "> %s%s %s\n", $name, $pad, Printable($val2) if defined $val2;
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
- $group = 'Unknown' if not $group and ($xml or $json or $csv);
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, $tag);
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 and print $vout "Setting new values from $csv database\n";
3141
- foreach $tag (OrderedKeys($csvInfo)) {
3142
- next if $tag =~ /\b(SourceFile|Directory|FileName)$/i; # don't write these
3143
- my ($rtn, $wrn) = $et->SetNewValue($tag, $$csvInfo{$tag},
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 (not $fixLen) {
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(Encode::decode_utf8($str)) };
3935
+ my $gcstr = eval { Unicode::GCString->new($str) };
3848
3936
  if ($gcstr) {
3849
3937
  $len = $gcstr->columns;
3850
3938
  } else {
3851
- $len = length Encode::decode_utf8($str);
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 ($recurse == 1 or $file eq '.' or $file eq '..');
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 and eval { require Cwd }) {
4271
- $path = eval { Cwd::abs_path($file) };
4272
- # make the delimiters and case consistent
4273
- # (abs_path is very inconsistent about what it returns in Windows)
4274
- if (defined $path and Image::ExifTool::IsPC()) {
4275
- $path =~ tr/\\/\//;
4276
- $path = lc $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 =~ /\$\{?((?:[-\w]+:)*[-\w?*]+)/g;
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/^(-[-:\w]+#?)\s*([-+<]?=) ?/$1$2/;
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<-TAG>.
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. The specifics of the I<FMT> syntax
5592
- are system dependent -- consult the C<strftime> man page on your system for
5593
- details. The default format is equivalent to "%Y:%m:%d %H:%M:%S". This
5594
- option has no effect on date-only or time-only tags and ignores timezone
5595
- information if present. ExifTool adds a C<%f> format code to represent
5596
- fractional seconds, and supports an optional width to specify the number of
5597
- digits after the decimal point (eg. C<%3f> would give something like
5598
- C<.437>), and a minus sign to drop the decimal point (eg. C<%-3f> would give
5599
- C<437>). Only one B<-d> option may be used per command. Requires
5600
- POSIX::strptime or Time::Piece for the inversion conversion when writing.
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.) Adding
5684
- the B<-D> or B<-H> option changes tag values to JSON objects with "val" and
5685
- "id" fields, and adding B<-l> adds a "desc" field, and a "num" field if the
5686
- numerical value is different from the converted "val". The B<-b> option may
5687
- be added to output binary data, encoded in base64 if necessary (indicated by
5688
- ASCII "base64:" as the first 7 bytes of the value), and B<-t> may be added
5689
- to include tag table information (see B<-t> for details). The JSON output
5690
- is UTF-8 regardless of any B<-L> or B<-charset> option setting, but the
5691
- UTF-8 validation is disabled if a character set other than UTF-8 is
5692
- specified. Note that ExifTool quotes JSON values only if they don't look
5693
- like numbers (regardless of the original storage format or the relevant
5694
- metadata specification).
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.00 --
5987
+ -- Generated by ExifTool 13.16 --
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
- When B<-ee> (B<-extractEmbedded>) is combined with B<-p>, embedded documents
5865
- are effectively processed as separate input files.
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. For more
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<-TAG> or B<--TAG> options. For example, below is a command to compare all
6689
- the same-named files in two different directories, ignoring the System tags:
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. The following text formatting options are valid
6697
- when B<-diff> is used: B<-c>, B<-charset>, B<-d>, B<-E>, B<-ec>, B<-ex>,
6698
- B<-L>, B<-lang>, B<-n>, B<-s>, B<-sep>, B<-struct> and B<-w>.
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
- When the C<Geotime> value is converted to UTC, the local system timezone is
6714
- assumed unless the date/time value contains a timezone. Writing C<Geotime>
6715
- causes the following tags to be written (provided they can be calculated
6716
- from the track log, and they are supported by the destination metadata
6717
- format): GPSLatitude, GPSLatitudeRef, GPSLongitude, GPSLongitudeRef,
6718
- GPSAltitude, GPSAltitudeRef, GPSDateStamp, GPSTimeStamp, GPSDateTime,
6719
- GPSTrack, GPSTrackRef, GPSSpeed, GPSSpeedRef, GPSImgDirection,
6720
- GPSImgDirectionRef, GPSPitch, GPSRoll, GPSCoordinates, AmbientTemperature
6721
- and CameraElevationAngle. By default, in image files tags are created in
6722
- EXIF, and updated in XMP only if they already exist. In QuickTime-format
6723
- files GPSCoordinates is created in the preferred location (ItemList by
6724
- default) as well as in XMP. However, C<EXIF:Geotime>, C<XMP:Geotime> or
6725
- C<QuickTime:Geotime> may be specified to write to write only to one group.
6726
- Also, C<ItemList:Geotime>, C<Keys:Geotime> or C<UserData:Geotime> may be
6727
- used to write to a specific location in QuickTime-format files. Note that
6728
- GPSPitch and GPSRoll are non-standard, and require user-defined tags in
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 Windows
7201
- users must use double quotes instead of single quotes as below around
7202
- arguments containing special characters.
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 -Comment='This is a new comment' dst.jpg
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&uuml;hl' -E dst.jpg
7487
+ =item C<exiftool -xmp:description-de='k&uuml;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 '-Directory<DateTimeOriginal' -d %Y/%m/%d dir
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 . '-Directory<DateTimeOriginal' -d %Y/%m/%d dir
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 '-filename<%f_${model;}.%e' dir
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 '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir
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 '-FileName<CreateDate' -d %Y-%m-%d/%H%M_%%f.%%e dir
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 '-FileName<${CreateDate}_$filenumber.jpg' -d %Y%m%d -ext jpg .
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-2024, Phil Harvey
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.