exiftool_vendored 13.10.0 → 13.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (212) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +33 -0
  3. data/bin/MANIFEST +1 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +3 -3
  7. data/bin/exiftool +206 -148
  8. data/bin/lib/File/RandomAccess.pm +1 -1
  9. data/bin/lib/File/RandomAccess.pod +2 -2
  10. data/bin/lib/Image/ExifTool/AAC.pm +1 -1
  11. data/bin/lib/Image/ExifTool/AES.pm +1 -1
  12. data/bin/lib/Image/ExifTool/AFCP.pm +1 -1
  13. data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
  14. data/bin/lib/Image/ExifTool/APE.pm +1 -1
  15. data/bin/lib/Image/ExifTool/APP12.pm +1 -1
  16. data/bin/lib/Image/ExifTool/ASF.pm +1 -1
  17. data/bin/lib/Image/ExifTool/Apple.pm +1 -1
  18. data/bin/lib/Image/ExifTool/Audible.pm +1 -1
  19. data/bin/lib/Image/ExifTool/BMP.pm +1 -1
  20. data/bin/lib/Image/ExifTool/BPG.pm +1 -1
  21. data/bin/lib/Image/ExifTool/BZZ.pm +1 -1
  22. data/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
  23. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +6 -6
  24. data/bin/lib/Image/ExifTool/CBOR.pm +1 -1
  25. data/bin/lib/Image/ExifTool/Canon.pm +8 -4
  26. data/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
  27. data/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
  28. data/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
  29. data/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
  30. data/bin/lib/Image/ExifTool/Casio.pm +1 -1
  31. data/bin/lib/Image/ExifTool/Charset.pm +1 -1
  32. data/bin/lib/Image/ExifTool/DICOM.pm +1 -1
  33. data/bin/lib/Image/ExifTool/DJI.pm +96 -45
  34. data/bin/lib/Image/ExifTool/DNG.pm +1 -1
  35. data/bin/lib/Image/ExifTool/DPX.pm +1 -1
  36. data/bin/lib/Image/ExifTool/DV.pm +1 -1
  37. data/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
  38. data/bin/lib/Image/ExifTool/DjVu.pm +1 -1
  39. data/bin/lib/Image/ExifTool/EXE.pm +123 -32
  40. data/bin/lib/Image/ExifTool/Exif.pm +7 -4
  41. data/bin/lib/Image/ExifTool/FITS.pm +1 -1
  42. data/bin/lib/Image/ExifTool/FLAC.pm +1 -1
  43. data/bin/lib/Image/ExifTool/FLIF.pm +1 -1
  44. data/bin/lib/Image/ExifTool/FLIR.pm +1 -1
  45. data/bin/lib/Image/ExifTool/Fixup.pm +1 -1
  46. data/bin/lib/Image/ExifTool/Flash.pm +1 -1
  47. data/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
  48. data/bin/lib/Image/ExifTool/Font.pm +1 -1
  49. data/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
  50. data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
  51. data/bin/lib/Image/ExifTool/GE.pm +1 -1
  52. data/bin/lib/Image/ExifTool/GIF.pm +1 -1
  53. data/bin/lib/Image/ExifTool/GIMP.pm +1 -1
  54. data/bin/lib/Image/ExifTool/GM.pm +1 -1
  55. data/bin/lib/Image/ExifTool/GPS.pm +1 -1
  56. data/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
  57. data/bin/lib/Image/ExifTool/Geolocation.pm +1 -1
  58. data/bin/lib/Image/ExifTool/Geotag.pm +1 -1
  59. data/bin/lib/Image/ExifTool/GoPro.pm +1 -1
  60. data/bin/lib/Image/ExifTool/H264.pm +1 -1
  61. data/bin/lib/Image/ExifTool/HP.pm +1 -1
  62. data/bin/lib/Image/ExifTool/HTML.pm +1 -1
  63. data/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
  64. data/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
  65. data/bin/lib/Image/ExifTool/ICO.pm +1 -1
  66. data/bin/lib/Image/ExifTool/ID3.pm +1 -1
  67. data/bin/lib/Image/ExifTool/IPTC.pm +8 -5
  68. data/bin/lib/Image/ExifTool/ISO.pm +1 -1
  69. data/bin/lib/Image/ExifTool/ITC.pm +1 -1
  70. data/bin/lib/Image/ExifTool/Import.pm +5 -4
  71. data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
  72. data/bin/lib/Image/ExifTool/InfiRay.pm +1 -1
  73. data/bin/lib/Image/ExifTool/JPEG.pm +1 -1
  74. data/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
  75. data/bin/lib/Image/ExifTool/JSON.pm +1 -1
  76. data/bin/lib/Image/ExifTool/JVC.pm +1 -1
  77. data/bin/lib/Image/ExifTool/Jpeg2000.pm +1 -1
  78. data/bin/lib/Image/ExifTool/Kodak.pm +1 -1
  79. data/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
  80. data/bin/lib/Image/ExifTool/LIF.pm +1 -1
  81. data/bin/lib/Image/ExifTool/LNK.pm +1 -1
  82. data/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
  83. data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
  84. data/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
  85. data/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
  86. data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
  87. data/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
  88. data/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
  89. data/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
  90. data/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
  91. data/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
  92. data/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
  93. data/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
  94. data/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
  95. data/bin/lib/Image/ExifTool/Lang/sk.pm +1 -1
  96. data/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
  97. data/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
  98. data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
  99. data/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
  100. data/bin/lib/Image/ExifTool/Leaf.pm +1 -1
  101. data/bin/lib/Image/ExifTool/LigoGPS.pm +408 -0
  102. data/bin/lib/Image/ExifTool/Lytro.pm +1 -1
  103. data/bin/lib/Image/ExifTool/M2TS.pm +22 -13
  104. data/bin/lib/Image/ExifTool/MIE.pm +1 -1
  105. data/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
  106. data/bin/lib/Image/ExifTool/MIFF.pm +1 -1
  107. data/bin/lib/Image/ExifTool/MISB.pm +1 -1
  108. data/bin/lib/Image/ExifTool/MNG.pm +1 -1
  109. data/bin/lib/Image/ExifTool/MOI.pm +1 -1
  110. data/bin/lib/Image/ExifTool/MPC.pm +1 -1
  111. data/bin/lib/Image/ExifTool/MPEG.pm +1 -1
  112. data/bin/lib/Image/ExifTool/MPF.pm +1 -1
  113. data/bin/lib/Image/ExifTool/MRC.pm +1 -1
  114. data/bin/lib/Image/ExifTool/MWG.pm +1 -1
  115. data/bin/lib/Image/ExifTool/MXF.pm +1 -1
  116. data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
  117. data/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
  118. data/bin/lib/Image/ExifTool/Matroska.pm +12 -4
  119. data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
  120. data/bin/lib/Image/ExifTool/Minolta.pm +1 -1
  121. data/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
  122. data/bin/lib/Image/ExifTool/Motorola.pm +1 -1
  123. data/bin/lib/Image/ExifTool/Nikon.pm +164 -35
  124. data/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
  125. data/bin/lib/Image/ExifTool/NikonCustom.pm +1 -1
  126. data/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
  127. data/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
  128. data/bin/lib/Image/ExifTool/OOXML.pm +1 -1
  129. data/bin/lib/Image/ExifTool/Ogg.pm +1 -1
  130. data/bin/lib/Image/ExifTool/Olympus.pm +1 -1
  131. data/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
  132. data/bin/lib/Image/ExifTool/Opus.pm +1 -1
  133. data/bin/lib/Image/ExifTool/Other.pm +1 -1
  134. data/bin/lib/Image/ExifTool/PCX.pm +1 -1
  135. data/bin/lib/Image/ExifTool/PDF.pm +1 -1
  136. data/bin/lib/Image/ExifTool/PGF.pm +1 -1
  137. data/bin/lib/Image/ExifTool/PICT.pm +1 -1
  138. data/bin/lib/Image/ExifTool/PLIST.pm +1 -1
  139. data/bin/lib/Image/ExifTool/PLUS.pm +1 -1
  140. data/bin/lib/Image/ExifTool/PNG.pm +1 -1
  141. data/bin/lib/Image/ExifTool/PPM.pm +1 -1
  142. data/bin/lib/Image/ExifTool/PSP.pm +1 -1
  143. data/bin/lib/Image/ExifTool/Palm.pm +1 -1
  144. data/bin/lib/Image/ExifTool/Panasonic.pm +20 -2
  145. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
  146. data/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  147. data/bin/lib/Image/ExifTool/Pentax.pm +1 -1
  148. data/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
  149. data/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
  150. data/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
  151. data/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
  152. data/bin/lib/Image/ExifTool/PostScript.pm +1 -1
  153. data/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
  154. data/bin/lib/Image/ExifTool/Protobuf.pm +24 -14
  155. data/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
  156. data/bin/lib/Image/ExifTool/QuickTime.pm +46 -17
  157. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +20 -302
  158. data/bin/lib/Image/ExifTool/README +4 -0
  159. data/bin/lib/Image/ExifTool/RIFF.pm +1 -1
  160. data/bin/lib/Image/ExifTool/RSRC.pm +1 -1
  161. data/bin/lib/Image/ExifTool/RTF.pm +1 -1
  162. data/bin/lib/Image/ExifTool/Radiance.pm +1 -1
  163. data/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
  164. data/bin/lib/Image/ExifTool/Real.pm +1 -1
  165. data/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
  166. data/bin/lib/Image/ExifTool/Red.pm +1 -1
  167. data/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
  168. data/bin/lib/Image/ExifTool/Samsung.pm +1 -1
  169. data/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
  170. data/bin/lib/Image/ExifTool/Scalado.pm +1 -1
  171. data/bin/lib/Image/ExifTool/Shift.pl +1 -1
  172. data/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
  173. data/bin/lib/Image/ExifTool/Sigma.pm +1 -1
  174. data/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
  175. data/bin/lib/Image/ExifTool/Sony.pm +1 -1
  176. data/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
  177. data/bin/lib/Image/ExifTool/Stim.pm +1 -1
  178. data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
  179. data/bin/lib/Image/ExifTool/TagLookup.pm +11 -5
  180. data/bin/lib/Image/ExifTool/TagNames.pod +84 -34
  181. data/bin/lib/Image/ExifTool/Text.pm +1 -1
  182. data/bin/lib/Image/ExifTool/Theora.pm +1 -1
  183. data/bin/lib/Image/ExifTool/Torrent.pm +1 -1
  184. data/bin/lib/Image/ExifTool/Unknown.pm +1 -1
  185. data/bin/lib/Image/ExifTool/VCard.pm +1 -1
  186. data/bin/lib/Image/ExifTool/Validate.pm +1 -1
  187. data/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
  188. data/bin/lib/Image/ExifTool/WPG.pm +1 -1
  189. data/bin/lib/Image/ExifTool/WTV.pm +1 -1
  190. data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
  191. data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
  192. data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  193. data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
  194. data/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
  195. data/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
  196. data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
  197. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +5 -3
  198. data/bin/lib/Image/ExifTool/WriteRIFF.pl +1 -1
  199. data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
  200. data/bin/lib/Image/ExifTool/Writer.pl +9 -8
  201. data/bin/lib/Image/ExifTool/XISF.pm +1 -1
  202. data/bin/lib/Image/ExifTool/XMP.pm +1 -1
  203. data/bin/lib/Image/ExifTool/XMP2.pl +1 -1
  204. data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
  205. data/bin/lib/Image/ExifTool/ZIP.pm +1 -1
  206. data/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
  207. data/bin/lib/Image/ExifTool/iWork.pm +1 -1
  208. data/bin/lib/Image/ExifTool.pm +13 -7
  209. data/bin/lib/Image/ExifTool.pod +14 -5
  210. data/bin/perl-Image-ExifTool.spec +1 -1
  211. data/lib/exiftool_vendored/version.rb +1 -1
  212. metadata +3 -2
data/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '13.10';
14
+ my $version = '13.12';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  my $exePath;
@@ -641,7 +641,7 @@ for (;;) {
641
641
  }
642
642
  # require MWG module if used in any argument
643
643
  # (note: doesn't cover the -p option because these tags will be parsed on the 2nd pass)
644
- $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;
645
645
  if ($useMWG) {
646
646
  require Image::ExifTool::MWG;
647
647
  Image::ExifTool::MWG::Load();
@@ -1093,7 +1093,7 @@ for (;;) {
1093
1093
  # prevent processing file unnecessarily for simple case of failed '$ok' or 'not $ok'
1094
1094
  $cond =~ /^\s*(not\s*)\$ok\s*$/i and ($1 xor $rtnValPrev) and $failCondition=1;
1095
1095
  # add to list of requested tags
1096
- push @requestTags, $cond =~ /\$\{?((?:[-\w]+:)*[-\w?*]+)/g;
1096
+ push @requestTags, $cond =~ /\$\{?((?:[-_0-9A-Z]+:)*[-_0-9A-Z?*]+)/ig;
1097
1097
  push @condition, $cond;
1098
1098
  next;
1099
1099
  }
@@ -1181,7 +1181,7 @@ for (;;) {
1181
1181
  if ($pass) {
1182
1182
  LoadPrintFormat($fmt, $1 || $binaryOutput);
1183
1183
  # load MWG module now if necessary
1184
- if (not $useMWG and grep /^mwg:/i, @requestTags) {
1184
+ if (not $useMWG and grep /^([-_0-9A-Z]+:)*1?mwg:/i, @requestTags) {
1185
1185
  $useMWG = 1;
1186
1186
  require Image::ExifTool::MWG;
1187
1187
  Image::ExifTool::MWG::Load();
@@ -1380,11 +1380,11 @@ for (;;) {
1380
1380
  push @newValues, { SaveCount => ++$saveCount };
1381
1381
  }
1382
1382
  push @newValues, $_;
1383
- if (/^mwg:/i) {
1383
+ if (/^([-_0-9A-Z]+:)*1?mwg:/i) {
1384
1384
  $useMWG = 1;
1385
- } elsif (/^([-\w]+:)*(filename|directory|testname)\b/i) {
1385
+ } elsif (/^([-_0-9A-Z]+:)*(filename|directory|testname)\b/i) {
1386
1386
  $doSetFileName = 1;
1387
- } elsif (/^([-\w]+:)*(geotag|geotime|geosync|geolocate)\b/i) {
1387
+ } elsif (/^([-_0-9A-Z]+:)*(geotag|geotime|geosync|geolocate)\b/i) {
1388
1388
  if (lc $2 eq 'geotime') {
1389
1389
  $addGeotime = '';
1390
1390
  } else {
@@ -1402,25 +1402,23 @@ for (;;) {
1402
1402
  if ($setTagsFile) {
1403
1403
  push @{$setTags{$setTagsFile}}, $_;
1404
1404
  if ($1 eq '>') {
1405
- $useMWG = 1 if /^(.*>\s*)?mwg:/si;
1405
+ $useMWG = 1 if /^(.*>\s*)?([-_0-9A-Z]+:)*1?mwg:/si;
1406
1406
  if (/\b(filename|directory|testname)#?$/i) {
1407
1407
  $doSetFileName = 1;
1408
1408
  } elsif (/\bgeotime#?$/i) {
1409
1409
  $addGeotime = '';
1410
1410
  }
1411
1411
  } else {
1412
- $useMWG = 1 if /^([^<]+<\s*(.*\$\{?)?)?mwg:/si;
1413
- 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) {
1414
1414
  $doSetFileName = 1;
1415
- } elsif (/^([-\w]+:)*geotime\b/i) {
1415
+ } elsif (/^([-_0-9A-Z]+:)*geotime\b/i) {
1416
1416
  $addGeotime = '';
1417
1417
  }
1418
1418
  }
1419
1419
  } else {
1420
1420
  my $lst = s/^-// ? \@exclude : \@tags;
1421
- unless (/^([-\w*]+:)*([-\w*?]+)#?$/) {
1422
- Warn(qq(Invalid TAG name: "$_"\n));
1423
- }
1421
+ Warn(qq(Invalid TAG name: "$_"\n)) unless /^([-_0-9A-Z*]+:)*([-_0-9A-Z*?]+)#?$/i;
1424
1422
  push @$lst, $_; # (push everything for backward compatibility)
1425
1423
  }
1426
1424
  }
@@ -1763,9 +1761,11 @@ if (@newValues) {
1763
1761
  $wrn and Warning($mt, $wrn);
1764
1762
  }
1765
1763
  # exclude specified tags
1766
- foreach (@exclude) {
1767
- $mt->SetNewValue($_, undef, Replace => 2);
1768
- $needSave = 1;
1764
+ unless ($csv) {
1765
+ foreach (@exclude) {
1766
+ $mt->SetNewValue($_, undef, Replace => 2);
1767
+ $needSave = 1;
1768
+ }
1769
1769
  }
1770
1770
  unless ($isWriting or $outOpt or @tags) {
1771
1771
  Warn "Nothing to do.\n";
@@ -2296,6 +2296,10 @@ sub GetImageInfo($$)
2296
2296
  $et->Options(Duplicates => 1, Sort => "Group$showGroup", Verbose => 0);
2297
2297
  $et2 = Image::ExifTool->new;
2298
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});
2299
2303
  @found2 = @foundTags;
2300
2304
  $info2 = $et2->ImageInfo($file2, \@found2);
2301
2305
  } else {
@@ -2352,14 +2356,15 @@ sub GetImageInfo($$)
2352
2356
 
2353
2357
  # print differences if requested
2354
2358
  if (defined $diff) {
2355
- my (%done2, $wasDiff, @diffs, @groupTags2);
2359
+ my (%done, %done2, $wasDiff, @diffs, @groupTags2);
2356
2360
  my $v = $verbose || 0;
2357
2361
  print $fp "======== diff < $file > $file2\n";
2358
2362
  my ($g2, $same) = (0, 0); # start with $g2 false, but not equal to '' to avoid infinite loop
2359
2363
  for (;;) {
2364
+ my ($g, $tag2, $i, $key, @dupl, $val2, $t2, $equal, %used);
2360
2365
  my $tag = shift @foundTags;
2361
- my ($g, $tag2);
2362
2366
  if (defined $tag) {
2367
+ $done{$tag} = 1;
2363
2368
  $g = $et->GetGroup($tag, $showGroup);
2364
2369
  } else {
2365
2370
  for (;;) {
@@ -2369,7 +2374,6 @@ sub GetImageInfo($$)
2369
2374
  }
2370
2375
  }
2371
2376
  if ($g ne $g2) {
2372
- my $t2;
2373
2377
  # add any outstanding tags from diff file not yet handled in previous group ($g2)
2374
2378
  foreach $t2 (@groupTags2) {
2375
2379
  next if $done2{$t2};
@@ -2408,33 +2412,50 @@ sub GetImageInfo($$)
2408
2412
  my $val = $et->GetValue($tag);
2409
2413
  next unless defined $val; # (just in case)
2410
2414
  my $name = GetTagName($tag);
2411
- # get matching tag key from diff file
2415
+ my $desc = $outFormat < 1 ? $et->GetDescription($tag) : $name;
2416
+ # get matching tag key(s) from diff file
2412
2417
  my @tags2 = grep /^$name( |$)/, @groupTags2;
2413
- $name = $et->GetDescription($tag) if $outFormat < 1;
2414
- my ($val2, $t2);
2415
- foreach $t2 (@tags2) {
2418
+ T2: foreach $t2 (@tags2) {
2416
2419
  next if $done2{$t2};
2417
2420
  $tag2 = $t2;
2418
2421
  $val2 = $et2->GetValue($t2);
2422
+ next unless defined $val2;
2423
+ IsEqual($val, $val2) and $equal = 1, last;
2424
+ # look ahead for upcoming duplicate tags in this group to see
2425
+ # if any would later match this value (and skip those for now)
2426
+ if ($$et{DUPL_TAG}{$name} and not @dupl) {
2427
+ for ($i=0, $key=$name; $i<=$$et{DUPL_TAG}{$name}; ++$i, $key="$name ($i)") {
2428
+ push @dupl, $key unless $done{$key} or $g ne $et->GetGroup($key, $showGroup);
2429
+ }
2430
+ @dupl = sort { $$et{FILE_ORDER}{$a} <=> $$et{FILE_ORDER}{$b} } @dupl if @dupl > 1;
2431
+ }
2432
+ foreach (@dupl) {
2433
+ next if $used{$_};
2434
+ my $v = $et->GetValue($_);
2435
+ next unless defined($v) and IsEqual($v, $val2);
2436
+ $used{$_} = 1; # would match this upcoming tag
2437
+ undef($tag2); undef($val2);
2438
+ next T2;
2439
+ }
2419
2440
  last;
2420
2441
  }
2421
- if (defined $val2 and IsEqual($val, $val2)) {
2442
+ if ($equal) {
2422
2443
  ++$same;
2423
2444
  } else {
2424
- my $len = LengthUTF8($name);
2445
+ my $len = LengthUTF8($desc);
2425
2446
  my $pad = $outFormat < 2 ? ' ' x ($len < 32 ? 32 - $len : 0) : '';
2426
2447
  if ($allGroup) {
2427
2448
  my $grp = "[$g]";
2428
2449
  $grp .= ' ' x (15 - length($grp)) if length($grp) < 15 and $outFormat < 2;
2429
- push @diffs, sprintf "< %s %s%s: %s\n", $grp, $name, $pad, Printable($val);
2450
+ push @diffs, sprintf "< %s %s%s: %s\n", $grp, $desc, $pad, Printable($val);
2430
2451
  if (defined $val2) {
2431
- $grp = ' ' x length($grp), $name = ' ' x $len if $v < 3;
2432
- push @diffs, sprintf "> %s %s%s: %s\n", $grp, $name, $pad, Printable($val2);
2452
+ $grp = ' ' x length($grp), $desc = ' ' x $len if $v < 3;
2453
+ push @diffs, sprintf "> %s %s%s: %s\n", $grp, $desc, $pad, Printable($val2);
2433
2454
  }
2434
2455
  } else {
2435
- push @diffs, sprintf "< %s%s: %s\n", $name, $pad, Printable($val);
2436
- $name = ' ' x $len if $v < 3;
2437
- push @diffs, sprintf "> %s%s %s\n", $name, $pad, Printable($val2) if defined $val2;
2456
+ push @diffs, sprintf "< %s%s: %s\n", $desc, $pad, Printable($val);
2457
+ $desc = ' ' x $len if $v < 3;
2458
+ push @diffs, sprintf "> %s%s %s\n", $desc, $pad, Printable($val2) if defined $val2;
2438
2459
  }
2439
2460
  }
2440
2461
  $done2{$tag2} = 1 if defined $tag2;
@@ -3147,7 +3168,7 @@ sub SetImageInfo($$$)
3147
3168
  next;
3148
3169
  } elsif (ref $dyFile eq 'SCALAR') {
3149
3170
  # set new values from CSV or JSON database
3150
- my ($f, $found, $tag);
3171
+ my ($f, $found, $csvTag, $tryTag, $tg);
3151
3172
  undef $evalWarning;
3152
3173
  local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] };
3153
3174
  # force UTF-8 if the database was JSON
@@ -3169,11 +3190,39 @@ sub SetImageInfo($$$)
3169
3190
  print $vout 'Including tags: ',join(' ',@tags),"\n" if @tags;
3170
3191
  print $vout 'Excluding tags: ',join(' ',@exclude),"\n" if @exclude;
3171
3192
  }
3172
- foreach $tag (OrderedKeys($csvInfo)) {
3173
- next if $tag =~ /\b(SourceFile|Directory|FileName)$/i; # don't write these
3174
- next if @tags and not grep /^\Q$tag\E$/i, @tags;
3175
- next if @exclude and grep /^\Q$tag\E$/i, @exclude;
3176
- my ($rtn, $wrn) = $et->SetNewValue($tag, $$csvInfo{$tag},
3193
+ my @tryTags = (@exclude, @tags); # (exclude first because it takes priority)
3194
+ foreach (@tryTags) {
3195
+ tr/-0-9a-zA-Z_:#?*//dc; # remove illegal characters
3196
+ s/(^|:)(all:)+/$1/ig; # remove 'all' group names
3197
+ s/(^|:)all(#?)$/$1*$2/i; # convert 'all' tag name to '*'
3198
+ tr/?/./; s/\*/.*/g; # convert wildcards for regex
3199
+ }
3200
+ foreach $csvTag (OrderedKeys($csvInfo)) {
3201
+ # don't write SourceFile, Directory or FileName
3202
+ next if $csvTag =~ /^([-_0-9A-Z]+:)*(SourceFile|Directory|FileName)$/i;
3203
+ if (@tryTags) {
3204
+ my ($i, $tryGrp, $matched);
3205
+ TryMatch: for ($i=0; $i<@tryTags; ++$i) {
3206
+ $tryTag = $tryTags[$i];
3207
+ if ($tryTag =~ /:/) {
3208
+ next unless $csvTag =~ /:/; # db entry must also specify group
3209
+ my @csvGrps = split /:/, $csvTag;
3210
+ my @tryGrps = split /:/, $tryTag;
3211
+ my $tryName = pop @tryGrps;
3212
+ next unless pop(@csvGrps) =~ /^$tryName$/i; # tag name must match
3213
+ foreach $tryGrp (@tryGrps) {
3214
+ # each specified group name must match db entry
3215
+ next TryMatch unless grep /^$tryGrp$/i, @csvGrps;
3216
+ }
3217
+ $matched = 1;
3218
+ last;
3219
+ }
3220
+ # no group specified, so match by tag name only
3221
+ $csvTag =~ /^([-_0-9A-Z]+:)*$tryTag$/i and $matched = 1, last;
3222
+ }
3223
+ next if $matched ? $i < @exclude : @tags;
3224
+ }
3225
+ my ($rtn, $wrn) = $et->SetNewValue($csvTag, $$csvInfo{$csvTag},
3177
3226
  Protected => 1, AddValue => $csvAdd,
3178
3227
  ProtectSaved => $csvSaveCount);
3179
3228
  $wrn and Warn "$wrn\n" if $verbose;
@@ -4363,7 +4412,7 @@ sub AddPrintFormat($)
4363
4412
  $printFmt{$type} or $printFmt{$type} = [ ];
4364
4413
  push @{$printFmt{$type}}, $expr;
4365
4414
  # add to list of requested tags
4366
- push @requestTags, $expr =~ /\$\{?((?:[-\w]+:)*[-\w?*]+)/g;
4415
+ push @requestTags, $expr =~ /\$\{?((?:[-_0-9A-Z]+:)*[-_0-9A-Z?*]+)/ig;
4367
4416
  $printFmt{SetTags} = 1 if $expr =~ /\bSetTags\b/;
4368
4417
  }
4369
4418
 
@@ -4718,7 +4767,7 @@ sub FilterArgfileLine($)
4718
4767
  $arg =~ s/^\s+//; # remove leading white space
4719
4768
  $arg =~ s/[\x0d\x0a]+$//s; # remove trailing newline
4720
4769
  # remove white space before, and single space after '=', '+=', '-=' or '<='
4721
- $arg =~ s/^(-[-:\w]+#?)\s*([-+<]?=) ?/$1$2/;
4770
+ $arg =~ s/^(-[-_0-9A-Z:]+#?)\s*([-+<]?=) ?/$1$2/i;
4722
4771
  return undef if $arg eq '';
4723
4772
  }
4724
4773
  return $arg;
@@ -5598,9 +5647,13 @@ deleted). Also, FileName and Directory columns are ignored if they exist
5598
5647
  all other columns are imported. To force a tag to be deleted, use the B<-f>
5599
5648
  option and set the value to "-" in the CSV file (or to the MissingTagValue
5600
5649
  if this API option was used). Multiple databases may be imported in a
5601
- single command. Specific tags may be imported from the database by adding
5602
- B<->I<TAG> options to the command, or excluded with B<-->I<TAG> options.
5603
- If no tags are specified, then all except FileName and Directory are used.
5650
+ single command.
5651
+
5652
+ Specific tags may be imported from the CSV database by adding B<->I<TAG>
5653
+ options to the command, or excluded with B<-->I<TAG>, with exclusions taking
5654
+ priority. Group names and wildcards are allowed. If no tags are specified,
5655
+ then all except FileName and Directory are used. Tags are imported in the
5656
+ same order as the database entries.
5604
5657
 
5605
5658
  When exporting a CSV file, the B<-g> or B<-G> option adds group names to the
5606
5659
  tag headings. If the B<-a> option is used to allow duplicate tag names, the
@@ -5783,9 +5836,13 @@ that options exporting JSON objects instead of simple values are not
5783
5836
  compatible with the import file format (ie. export with B<-D>, B<-H>, B<-l>,
5784
5837
  or B<-T> is not compatible, and use B<-G> instead of B<-g>). Additionally,
5785
5838
  tag names in the input JSON file may be suffixed with a C<#> to disable
5786
- print conversion. Specific tags may be imported from the database by adding
5787
- B<->I<TAG> options to the command, or excluded with B<-->I<TAG> options.
5788
- If no tags are specified, then all except FileName and Directory are used.
5839
+ print conversion.
5840
+
5841
+ Specific tags may be imported from the JSON database by adding B<->I<TAG>
5842
+ options to the command, or excluded with B<-->I<TAG>, with exclusions taking
5843
+ priority. Group names and wildcards are allowed. If no tags are specified,
5844
+ then all except FileName and Directory are used. Tags are imported in the
5845
+ same order as the database entries.
5789
5846
 
5790
5847
  Unlike CSV import, empty values are not ignored, and will cause an empty
5791
5848
  value to be written if supported by the specific metadata type. Tags are
@@ -5926,7 +5983,7 @@ with this command:
5926
5983
 
5927
5984
  produces output like this:
5928
5985
 
5929
- -- Generated by ExifTool 13.10 --
5986
+ -- Generated by ExifTool 13.12 --
5930
5987
  File: a.jpg - 2003:10:31 15:44:19
5931
5988
  (f/5.6, 1/60s, ISO 100)
5932
5989
  File: b.jpg - 2006:05:23 11:57:38
@@ -6778,9 +6835,10 @@ System tags:
6778
6835
  The B<-g> and B<-G> options may be used to organize the output by the
6779
6836
  specified family of groups, with B<-G1> being the default. The B<-a> option
6780
6837
  is implied. Adding B<-v> includes a count of the number of tags that are
6781
- the same in each group. The following text formatting options are valid
6782
- when B<-diff> is used: B<-c>, B<-charset>, B<-d>, B<-E>, B<-ec>, B<-ex>,
6783
- B<-L>, B<-lang>, B<-n>, B<-s>, B<-sep>, B<-struct> and B<-w>.
6838
+ the same in each group, and B<-v2> also indicates when zero tags were the
6839
+ same. The following text formatting options are valid when B<-diff> is
6840
+ used: B<-c>, B<-charset>, B<-d>, B<-E>, B<-ec>, B<-ex>, B<-L>, B<-lang>,
6841
+ B<-n>, B<-s>, B<-sep>, B<-struct> and B<-w>.
6784
6842
 
6785
6843
  =item B<-geotag> I<TRKFILE>
6786
6844
 
@@ -7281,13 +7339,13 @@ avoid processing hidden files (provided Win32API::File is available):
7281
7339
  B<Note>: Beware when cutting and pasting these examples into your terminal!
7282
7340
  Some characters such as single and double quotes and hyphens may have been
7283
7341
  changed into similar-looking yet functionally-different characters by the
7284
- text formatter used to display this documentation. Also note that Windows
7285
- users must use double quotes instead of single quotes as below around
7286
- arguments containing special characters.
7342
+ text formatter used to display this documentation. Also note that in the
7343
+ Windows cmd shell double quotes must be used instead of the single quotes
7344
+ used in the examples.
7287
7345
 
7288
7346
  =over 5
7289
7347
 
7290
- =item exiftool -a -u -g1 a.jpg
7348
+ =item C<exiftool -a -u -g1 a.jpg>
7291
7349
 
7292
7350
  Print all meta information in an image, including duplicate and unknown
7293
7351
  tags, sorted by group (for family 1). For performance reasons, this command
@@ -7296,89 +7354,89 @@ metadata extracted by external utilities, and metadata requiring excessive
7296
7354
  processing time may not be extracted). Add C<-ee3> and C<-api RequestAll=3>
7297
7355
  to the command to extract absolutely everything available.
7298
7356
 
7299
- =item exiftool -common dir
7357
+ =item C<exiftool -common dir>
7300
7358
 
7301
7359
  Print common meta information for all images in C<dir>. C<-common> is a
7302
7360
  L<shortcut tag|Image::ExifTool::Shortcuts> representing common EXIF meta
7303
7361
  information.
7304
7362
 
7305
- =item exiftool -T -createdate -aperture -shutterspeed -iso dir > out.txt
7363
+ =item C<exiftool -T -createdate -aperture -shutterspeed -iso dir E<gt> out.txt>
7306
7364
 
7307
7365
  List specified meta information in tab-delimited column form for all images
7308
7366
  in C<dir> to an output text file named "out.txt".
7309
7367
 
7310
- =item exiftool -s -ImageSize -ExposureTime b.jpg
7368
+ =item C<exiftool -s -ImageSize -ExposureTime b.jpg>
7311
7369
 
7312
7370
  Print ImageSize and ExposureTime tag names and values.
7313
7371
 
7314
- =item exiftool -l -canon c.jpg d.jpg
7372
+ =item C<exiftool -l -canon c.jpg d.jpg>
7315
7373
 
7316
7374
  Print standard Canon information from two image files.
7317
7375
 
7318
- =item exiftool -r -w .txt -common pictures
7376
+ =item C<exiftool -r -w .txt -common pictures>
7319
7377
 
7320
7378
  Recursively extract common meta information from files in C<pictures>
7321
7379
  directory, writing text output to C<.txt> files with the same names.
7322
7380
 
7323
- =item exiftool -b -ThumbnailImage image.jpg > thumbnail.jpg
7381
+ =item C<exiftool -b -ThumbnailImage image.jpg E<gt> thumbnail.jpg>
7324
7382
 
7325
7383
  Save thumbnail image from C<image.jpg> to a file called C<thumbnail.jpg>.
7326
7384
 
7327
- =item exiftool -b -JpgFromRaw -w _JFR.JPG -ext NEF -r .
7385
+ =item C<exiftool -b -JpgFromRaw -w _JFR.JPG -ext NEF -r .>
7328
7386
 
7329
7387
  Recursively extract JPG image from all Nikon NEF files in the current
7330
7388
  directory, adding C<_JFR.JPG> for the name of the output JPG files.
7331
7389
 
7332
- =item exiftool -a -b -W %d%f_%t%-c.%s -preview:all dir
7390
+ =item C<exiftool -a -b -W %d%f_%t%-c.%s -preview:all dir>
7333
7391
 
7334
7392
  Extract all types of preview images (ThumbnailImage, PreviewImage,
7335
7393
  JpgFromRaw, etc.) from files in directory "dir", adding the tag name to the
7336
7394
  output preview image file names.
7337
7395
 
7338
- =item exiftool -d '%r %a, %B %e, %Y' -DateTimeOriginal -S -s -ext jpg .
7396
+ =item C<exiftool -d '%r %a, %B %e, %Y' -DateTimeOriginal -S -s -ext jpg .>
7339
7397
 
7340
7398
  Print formatted date/time for all JPG files in the current directory.
7341
7399
 
7342
- =item exiftool -IFD1:XResolution -IFD1:YResolution image.jpg
7400
+ =item C<exiftool -IFD1:XResolution -IFD1:YResolution image.jpg>
7343
7401
 
7344
7402
  Extract image resolution from EXIF IFD1 information (thumbnail image IFD).
7345
7403
 
7346
- =item exiftool '-*resolution*' image.jpg
7404
+ =item C<exiftool '-*resolution*' image.jpg>
7347
7405
 
7348
7406
  Extract all tags with names containing the word "Resolution" from an image.
7349
7407
 
7350
- =item exiftool -xmp:author:all -a image.jpg
7408
+ =item C<exiftool -xmp:author:all -a image.jpg>
7351
7409
 
7352
7410
  Extract all author-related XMP information from an image.
7353
7411
 
7354
- =item exiftool -xmp -b a.jpg > out.xmp
7412
+ =item C<exiftool -xmp -b a.jpg E<gt> out.xmp>
7355
7413
 
7356
7414
  Extract complete XMP data record intact from C<a.jpg> and write it to
7357
7415
  C<out.xmp> using the special C<XMP> tag (see the Extra tags in
7358
7416
  L<Image::ExifTool::TagNames|Image::ExifTool::TagNames>).
7359
7417
 
7360
- =item exiftool -p '$filename has date $dateTimeOriginal' -q -f dir
7418
+ =item C<exiftool -p '$filename has date $dateTimeOriginal' -q -f dir>
7361
7419
 
7362
7420
  Print one line of output containing the file name and DateTimeOriginal for
7363
7421
  each image in directory C<dir>.
7364
7422
 
7365
- =item exiftool -ee3 -p '$gpslatitude, $gpslongitude, $gpstimestamp' a.m2ts
7423
+ =item C<exiftool -ee3 -p '$gpslatitude, $gpslongitude, $gpstimestamp' a.m2ts>
7366
7424
 
7367
7425
  Extract all GPS positions from an AVCHD video.
7368
7426
 
7369
- =item exiftool -icc_profile -b -w icc image.jpg
7427
+ =item C<exiftool -icc_profile -b -w icc image.jpg>
7370
7428
 
7371
7429
  Save complete ICC_Profile from an image to an output file with the same name
7372
7430
  and an extension of C<.icc>.
7373
7431
 
7374
- =item exiftool -htmldump -w tmp/%f_%e.html t/images
7432
+ =item C<exiftool -htmldump -w tmp/%f_%e.html t/images>
7375
7433
 
7376
7434
  Generate HTML pages from a hex dump of EXIF information in all images from
7377
7435
  the C<t/images> directory. The output HTML files are written to the C<tmp>
7378
7436
  directory (which is created if it didn't exist), with names of the form
7379
7437
  'FILENAME_EXT.html'.
7380
7438
 
7381
- =item exiftool -a -b -ee -embeddedimage -W Image_%.3g3.%s file.pdf
7439
+ =item C<exiftool -a -b -ee -embeddedimage -W Image_%.3g3.%s file.pdf>
7382
7440
 
7383
7441
  Extract embedded JPG and JP2 images from a PDF file. The output images will
7384
7442
  have file names like "Image_#.jpg" or "Image_#.jp2", where "#" is the
@@ -7396,130 +7454,130 @@ be used (eg. -Comment=E<34>This is a new commentE<34>).
7396
7454
 
7397
7455
  =over 5
7398
7456
 
7399
- =item exiftool -Comment='This is a new comment' dst.jpg
7457
+ =item C<exiftool -tagsfromfile src.jpg -exif:all --subifd:all dst.jpg>
7400
7458
 
7401
7459
  Write new comment to a JPG image (replaces any existing comment).
7402
7460
 
7403
- =item exiftool -comment= -o newdir -ext jpg .
7461
+ =item C<exiftool -comment= -o newdir -ext jpg .>
7404
7462
 
7405
7463
  Remove comment from all JPG images in the current directory, writing the
7406
7464
  modified images to a new directory.
7407
7465
 
7408
- =item exiftool -keywords=EXIF -keywords=editor dst.jpg
7466
+ =item C<exiftool -keywords=EXIF -keywords=editor dst.jpg>
7409
7467
 
7410
7468
  Replace existing keyword list with two new keywords (C<EXIF> and C<editor>).
7411
7469
 
7412
- =item exiftool -Keywords+=word -o newfile.jpg src.jpg
7470
+ =item C<exiftool -Keywords+=word -o newfile.jpg src.jpg>
7413
7471
 
7414
7472
  Copy a source image to a new file, and add a keyword (C<word>) to the
7415
7473
  current list of keywords.
7416
7474
 
7417
- =item exiftool -exposurecompensation+=-0.5 a.jpg
7475
+ =item C<exiftool -exposurecompensation+=-0.5 a.jpg>
7418
7476
 
7419
7477
  Decrement the value of ExposureCompensation by 0.5 EV. Note that += with a
7420
7478
  negative value is used for decrementing because the -= operator is used for
7421
7479
  conditional deletion (see next example).
7422
7480
 
7423
- =item exiftool -credit-=xxx dir
7481
+ =item C<exiftool -credit-=xxx dir>
7424
7482
 
7425
7483
  Delete Credit information from all files in a directory where the Credit
7426
7484
  value was C<xxx>.
7427
7485
 
7428
- =item exiftool -xmp:description-de='k&uuml;hl' -E dst.jpg
7486
+ =item C<exiftool -xmp:description-de='k&uuml;hl' -E dst.jpg>
7429
7487
 
7430
7488
  Write alternate language for XMP:Description, using HTML character escaping
7431
7489
  to input special characters.
7432
7490
 
7433
- =item exiftool -all= dst.jpg
7491
+ =item C<exiftool -all= dst.jpg>
7434
7492
 
7435
7493
  Delete all meta information from an image. Note: You should NOT do this to
7436
7494
  RAW images (except DNG) since proprietary RAW image formats often contain
7437
7495
  information in the makernotes that is necessary for converting the image.
7438
7496
 
7439
- =item exiftool -all= -comment='lonely' dst.jpg
7497
+ =item C<exiftool -all= -comment='lonely' dst.jpg>
7440
7498
 
7441
7499
  Delete all meta information from an image and add a comment back in. (Note
7442
7500
  that the order is important: C<-comment='lonely' -all=> would also delete
7443
7501
  the new comment.)
7444
7502
 
7445
- =item exiftool -all= --jfif:all dst.jpg
7503
+ =item C<exiftool -all= --jfif:all dst.jpg>
7446
7504
 
7447
7505
  Delete all meta information except JFIF group from an image.
7448
7506
 
7449
- =item exiftool -Photoshop:All= dst.jpg
7507
+ =item C<exiftool -Photoshop:All= dst.jpg>
7450
7508
 
7451
7509
  Delete Photoshop meta information from an image (note that the Photoshop
7452
7510
  information also includes IPTC).
7453
7511
 
7454
- =item exiftool -r -XMP-crss:all= DIR
7512
+ =item C<exiftool -r -XMP-crss:all= DIR>
7455
7513
 
7456
7514
  Recursively delete all XMP-crss information from images in a directory.
7457
7515
 
7458
- =item exiftool '-ThumbnailImageE<lt>=thumb.jpg' dst.jpg
7516
+ =item C<exiftool '-ThumbnailImageE<lt>=thumb.jpg' dst.jpg>
7459
7517
 
7460
7518
  Set the thumbnail image from specified file (Note: The quotes are necessary
7461
7519
  to prevent shell redirection).
7462
7520
 
7463
- =item exiftool '-JpgFromRawE<lt>=%d%f_JFR.JPG' -ext NEF -r .
7521
+ =item C<exiftool '-JpgFromRawE<lt>=%d%f_JFR.JPG' -ext NEF -r .>
7464
7522
 
7465
7523
  Recursively write JPEG images with filenames ending in C<_JFR.JPG> to the
7466
7524
  JpgFromRaw tag of like-named files with extension C<.NEF> in the current
7467
7525
  directory. (This is the inverse of the C<-JpgFromRaw> command of the
7468
7526
  L</READING EXAMPLES> section above.)
7469
7527
 
7470
- =item exiftool -DateTimeOriginal-='0:0:0 1:30:0' dir
7528
+ =item C<exiftool -DateTimeOriginal-='0:0:0 1:30:0' dir>
7471
7529
 
7472
7530
  Adjust original date/time of all images in directory C<dir> by subtracting
7473
7531
  one hour and 30 minutes. (This is equivalent to C<-DateTimeOriginal-=1.5>.
7474
7532
  See L<Image::ExifTool::Shift.pl|Image::ExifTool::Shift.pl> for details.)
7475
7533
 
7476
- =item exiftool -createdate+=3 -modifydate+=3 a.jpg b.jpg
7534
+ =item C<exiftool -createdate+=3 -modifydate+=3 a.jpg b.jpg>
7477
7535
 
7478
7536
  Add 3 hours to the CreateDate and ModifyDate timestamps of two images.
7479
7537
 
7480
- =item exiftool -AllDates+=1:30 -if '$make eq E<34>CanonE<34>' dir
7538
+ =item C<exiftool -AllDates+=1:30 -if '$make eq E<34>CanonE<34>' dir>
7481
7539
 
7482
7540
  Shift the values of DateTimeOriginal, CreateDate and ModifyDate forward by 1
7483
7541
  hour and 30 minutes for all Canon images in a directory. (The AllDates tag
7484
7542
  is provided as a shortcut for these three tags, allowing them to be accessed
7485
7543
  via a single tag.)
7486
7544
 
7487
- =item exiftool -xmp:city=Kingston image1.jpg image2.nef
7545
+ =item C<exiftool -xmp:city=Kingston image1.jpg image2.nef>
7488
7546
 
7489
7547
  Write a tag to the XMP group of two images. (Without the C<xmp:> this tag
7490
7548
  would get written to the IPTC group since C<City> exists in both, and IPTC
7491
7549
  is preferred by default.)
7492
7550
 
7493
- =item exiftool -LightSource-='Unknown (0)' dst.tiff
7551
+ =item C<exiftool -LightSource-='Unknown (0)' dst.tiff>
7494
7552
 
7495
7553
  Delete C<LightSource> tag only if it is unknown with a value of 0.
7496
7554
 
7497
- =item exiftool -whitebalance-=auto -WhiteBalance=tung dst.jpg
7555
+ =item C<exiftool -whitebalance-=auto -WhiteBalance=tung dst.jpg>
7498
7556
 
7499
7557
  Set C<WhiteBalance> to C<Tungsten> only if it was previously C<Auto>.
7500
7558
 
7501
- =item exiftool -comment-= -comment='new comment' a.jpg
7559
+ =item C<exiftool -comment-= -comment='new comment' a.jpg>
7502
7560
 
7503
7561
  Write a new comment only if the image doesn't have one already.
7504
7562
 
7505
- =item exiftool -o %d%f.xmp dir
7563
+ =item C<exiftool -o %d%f.xmp dir>
7506
7564
 
7507
7565
  Create XMP meta information data files for all images in C<dir>.
7508
7566
 
7509
- =item exiftool -o test.xmp -owner=Phil -title='XMP File'
7567
+ =item C<exiftool -o test.xmp -owner=Phil -title='XMP File'>
7510
7568
 
7511
7569
  Create an XMP data file only from tags defined on the command line.
7512
7570
 
7513
- =item exiftool '-ICC_Profile<=%d%f.icc' image.jpg
7571
+ =item C<exiftool '-ICC_Profile<=%d%f.icc' image.jpg>
7514
7572
 
7515
7573
  Write ICC_Profile to an image from a C<.icc> file of the same name.
7516
7574
 
7517
- =item exiftool -hierarchicalkeywords='{keyword=one,children={keyword=B}}'
7575
+ =item C<exiftool -hierarchicalkeywords='{keyword=one,children={keyword=B}}'>
7518
7576
 
7519
7577
  Write structured XMP information. See L<https://exiftool.org/struct.html>
7520
7578
  for more details.
7521
7579
 
7522
- =item exiftool -trailer:all= image.jpg
7580
+ =item C<exiftool -trailer:all= image.jpg>
7523
7581
 
7524
7582
  Delete any trailer found after the end of image (EOI) in a JPEG file. A
7525
7583
  number of digital cameras store a large PreviewImage after the JPEG EOI, and
@@ -7535,22 +7593,22 @@ These examples demonstrate the ability to copy tag values between files.
7535
7593
 
7536
7594
  =over 5
7537
7595
 
7538
- =item exiftool -tagsFromFile src.cr2 dst.jpg
7596
+ =item C<exiftool -tagsFromFile src.cr2 dst.jpg>
7539
7597
 
7540
7598
  Copy the values of all writable tags from C<src.cr2> to C<dst.jpg>, writing
7541
7599
  the information to same-named tags in the preferred groups.
7542
7600
 
7543
- =item exiftool -TagsFromFile src.jpg -all:all dst.jpg
7601
+ =item C<exiftool -TagsFromFile src.jpg -all:all dst.jpg>
7544
7602
 
7545
7603
  Copy the values of all writable tags from C<src.jpg> to C<dst.jpg>,
7546
7604
  preserving the original tag groups.
7547
7605
 
7548
- =item exiftool -all= -tagsfromfile src.jpg -exif:all dst.jpg
7606
+ =item C<exiftool -all= -tagsfromfile src.jpg -exif:all dst.jpg>
7549
7607
 
7550
7608
  Erase all meta information from C<dst.jpg> image, then copy EXIF tags from
7551
7609
  C<src.jpg>.
7552
7610
 
7553
- =item exiftool -exif:all= -tagsfromfile @ -all:all -unsafe bad.jpg
7611
+ =item C<exiftool -exif:all= -tagsfromfile @ -all:all -unsafe bad.jpg>
7554
7612
 
7555
7613
  Rebuild all EXIF meta information from scratch in an image. This technique
7556
7614
  can be used in JPEG images to repair corrupted EXIF information which
@@ -7559,7 +7617,7 @@ shortcut for unsafe EXIF tags in JPEG images which are not normally copied.
7559
7617
  See the L<tag name documentation|Image::ExifTool::TagNames> for more details
7560
7618
  about unsafe tags.
7561
7619
 
7562
- =item exiftool -Tagsfromfile a.jpg out.xmp
7620
+ =item C<exiftool -Tagsfromfile a.jpg out.xmp>
7563
7621
 
7564
7622
  Copy meta information from C<a.jpg> to an XMP data file. If the XMP data
7565
7623
  file C<out.xmp> already exists, it will be updated with the new information.
@@ -7568,46 +7626,46 @@ be created like this (files containing images may be edited but not
7568
7626
  created). See L</WRITING EXAMPLES> above for another technique to generate
7569
7627
  XMP files.
7570
7628
 
7571
- =item exiftool -tagsFromFile a.jpg -XMP:All= -ThumbnailImage= -m b.jpg
7629
+ =item C<exiftool -tagsFromFile a.jpg -XMP:All= -ThumbnailImage= -m b.jpg>
7572
7630
 
7573
7631
  Copy all meta information from C<a.jpg> to C<b.jpg>, deleting all XMP
7574
7632
  information and the thumbnail image from the destination.
7575
7633
 
7576
- =item exiftool -TagsFromFile src.jpg -title -author=Phil dst.jpg
7634
+ =item C<exiftool -TagsFromFile src.jpg -title -author=Phil dst.jpg>
7577
7635
 
7578
7636
  Copy title from one image to another and set a new author name.
7579
7637
 
7580
- =item exiftool -TagsFromFile a.jpg -ISO -TagsFromFile b.jpg -comment
7581
- dst.jpg
7638
+ =item C<exiftool -TagsFromFile a.jpg -ISO -TagsFromFile b.jpg -comment
7639
+ dst.jpg>
7582
7640
 
7583
7641
  Copy ISO from one image and Comment from another image to a destination
7584
7642
  image.
7585
7643
 
7586
- =item exiftool -tagsfromfile src.jpg -exif:all --subifd:all dst.jpg
7644
+ =item C<exiftool -tagsfromfile src.jpg -exif:all --subifd:all dst.jpg>
7587
7645
 
7588
7646
  Copy only the EXIF information from one image to another, excluding SubIFD
7589
7647
  tags.
7590
7648
 
7591
- =item exiftool '-FileModifyDateE<lt>DateTimeOriginal' dir
7649
+ =item C<exiftool '-FileModifyDateE<lt>DateTimeOriginal' dir>
7592
7650
 
7593
7651
  Use the original date from the meta information to set the same file's
7594
7652
  filesystem modification date for all images in a directory. (Note that
7595
7653
  C<-TagsFromFile @> is assumed if no other B<-TagsFromFile> is specified when
7596
7654
  redirecting information as in this example.)
7597
7655
 
7598
- =item exiftool -TagsFromFile src.jpg '-xmp:allE<lt>all' dst.jpg
7656
+ =item C<exiftool -TagsFromFile src.jpg '-xmp:allE<lt>all' dst.jpg>
7599
7657
 
7600
7658
  Copy all possible information from C<src.jpg> and write in XMP format to
7601
7659
  C<dst.jpg>.
7602
7660
 
7603
- =item exiftool '-Description<${FileName;s/\.[^.]*$//}' dir
7661
+ =item C<exiftool '-Description<${FileName;s/\.[^.]*$//}' dir>
7604
7662
 
7605
7663
  Set the image Description from the file name after removing the extension.
7606
7664
  This example uses the L</Advanced formatting feature> to perform a
7607
7665
  substitution operation to remove the last dot and subsequent characters from
7608
7666
  the file name.
7609
7667
 
7610
- =item exiftool -@ iptc2xmp.args -iptc:all= a.jpg
7668
+ =item C<exiftool -@ iptc2xmp.args -iptc:all= a.jpg>
7611
7669
 
7612
7670
  Translate IPTC information to XMP with appropriate tag name conversions, and
7613
7671
  delete the original IPTC information from an image. This example uses
@@ -7617,40 +7675,40 @@ Also included with the distribution are xmp2iptc.args (which performs the
7617
7675
  inverse conversion) and a few more .args files for other conversions between
7618
7676
  EXIF, IPTC and XMP.
7619
7677
 
7620
- =item exiftool -tagsfromfile %d%f.CR2 -r -ext JPG dir
7678
+ =item C<exiftool -tagsfromfile %d%f.CR2 -r -ext JPG dir>
7621
7679
 
7622
7680
  Recursively rewrite all C<JPG> images in C<dir> with information copied from
7623
7681
  the corresponding C<CR2> images in the same directories.
7624
7682
 
7625
- =item exiftool '-keywords+E<lt>make' image.jpg
7683
+ =item C<exiftool '-keywords+E<lt>make' image.jpg>
7626
7684
 
7627
7685
  Add camera make to list of keywords.
7628
7686
 
7629
- =item exiftool '-commentE<lt>ISO=$exif:iso Exposure=${shutterspeed}' dir
7687
+ =item C<exiftool '-commentE<lt>ISO=$exif:iso Exposure=${shutterspeed}' dir>
7630
7688
 
7631
7689
  Set the Comment tag of all images in C<dir> from the values of the EXIF:ISO
7632
7690
  and ShutterSpeed tags. The resulting comment will be in the form "ISO=100
7633
7691
  Exposure=1/60".
7634
7692
 
7635
- =item exiftool -TagsFromFile src.jpg -icc_profile dst.jpg
7693
+ =item C<exiftool -TagsFromFile src.jpg -icc_profile dst.jpg>
7636
7694
 
7637
7695
  Copy ICC_Profile from one image to another.
7638
7696
 
7639
- =item exiftool -TagsFromFile src.jpg -all:all dst.mie
7697
+ =item C<exiftool -TagsFromFile src.jpg -all:all dst.mie>
7640
7698
 
7641
7699
  Copy all meta information in its original form from a JPEG image to a MIE
7642
7700
  file. The MIE file will be created if it doesn't exist. This technique can
7643
7701
  be used to store the metadata of an image so it can be inserted back into
7644
7702
  the image (with the inverse command) later in a workflow.
7645
7703
 
7646
- =item exiftool -o dst.mie -all:all src.jpg
7704
+ =item C<exiftool -o dst.mie -all:all src.jpg>
7647
7705
 
7648
7706
  This command performs exactly the same task as the command above, except
7649
7707
  that the B<-o> option will not write to an output file that already exists.
7650
7708
 
7651
- =item exiftool -b -jpgfromraw -w %d%f_%ue.jpg -execute -b -previewimage -w
7709
+ =item C<exiftool -b -jpgfromraw -w %d%f_%ue.jpg -execute -b -previewimage -w
7652
7710
  %d%f_%ue.jpg -execute -tagsfromfile @ -srcfile %d%f_%ue.jpg
7653
- -overwrite_original -common_args --ext jpg DIR
7711
+ -overwrite_original -common_args --ext jpg DIR>
7654
7712
 
7655
7713
  [Advanced] Extract JpgFromRaw or PreviewImage from all but JPG files in DIR,
7656
7714
  saving them with file names like C<image_EXT.jpg>, then add all meta
@@ -7683,34 +7741,34 @@ examples.
7683
7741
 
7684
7742
  =over 5
7685
7743
 
7686
- =item exiftool -filename=new.jpg dir/old.jpg
7744
+ =item C<exiftool -filename=new.jpg dir/old.jpg>
7687
7745
 
7688
7746
  Rename C<old.jpg> to C<new.jpg> in directory C<dir>.
7689
7747
 
7690
- =item exiftool -directory=%e dir
7748
+ =item C<exiftool -directory=%e dir>
7691
7749
 
7692
7750
  Move all files from directory C<dir> into directories named by the original
7693
7751
  file extensions.
7694
7752
 
7695
- =item exiftool '-Directory<DateTimeOriginal' -d %Y/%m/%d dir
7753
+ =item C<exiftool '-DirectoryE<lt>DateTimeOriginal' -d %Y/%m/%d dir>
7696
7754
 
7697
7755
  Move all files in C<dir> into a directory hierarchy based on year, month and
7698
7756
  day of C<DateTimeOriginal>. eg) This command would move the file
7699
7757
  C<dir/image.jpg> with a C<DateTimeOriginal> of C<2005:10:12 16:05:56> to
7700
7758
  C<2005/10/12/image.jpg>.
7701
7759
 
7702
- =item exiftool -o . '-Directory<DateTimeOriginal' -d %Y/%m/%d dir
7760
+ =item C<exiftool -o . '-DirectoryE<lt>DateTimeOriginal' -d %Y/%m/%d dir>
7703
7761
 
7704
7762
  Same effect as above except files are copied instead of moved.
7705
7763
 
7706
- =item exiftool '-filename<%f_${model;}.%e' dir
7764
+ =item C<exiftool '-filenameE<lt>%f_${model;}.%e' dir>
7707
7765
 
7708
7766
  Rename all files in C<dir> by adding the camera model name to the file name.
7709
7767
  The semicolon after the tag name inside the braces causes characters which
7710
7768
  are invalid in Windows file names to be deleted from the tag value (see the
7711
7769
  L</Advanced formatting feature> for an explanation).
7712
7770
 
7713
- =item exiftool '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir
7771
+ =item C<exiftool '-FileNameE<lt>CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir>
7714
7772
 
7715
7773
  Rename all images in C<dir> according to the C<CreateDate> date and time,
7716
7774
  adding a copy number with leading '-' if the file already exists (C<%-c>),
@@ -7718,7 +7776,7 @@ and preserving the original file extension (C<%e>). Note the extra '%'
7718
7776
  necessary to escape the filename codes (C<%c> and C<%e>) in the date format
7719
7777
  string.
7720
7778
 
7721
- =item exiftool -r '-FileName<CreateDate' -d %Y-%m-%d/%H%M_%%f.%%e dir
7779
+ =item C<exiftool -r '-FileNameE<lt>CreateDate' -d %Y-%m-%d/%H%M_%%f.%%e dir>
7722
7780
 
7723
7781
  Both the directory and the filename may be changed together via the
7724
7782
  C<FileName> tag if the new C<FileName> contains a '/'. The example above
@@ -7726,7 +7784,7 @@ recursively renames all images in a directory by adding a C<CreateDate>
7726
7784
  timestamp to the start of the filename, then moves them into new directories
7727
7785
  named by date.
7728
7786
 
7729
- =item exiftool '-FileName<${CreateDate}_$filenumber.jpg' -d %Y%m%d -ext jpg .
7787
+ =item C<exiftool '-FileNameE<lt>${CreateDate}_$filenumber.jpg' -d %Y%m%d -ext jpg .>
7730
7788
 
7731
7789
  Set the filename of all JPG images in the current directory from the
7732
7790
  CreateDate and FileNumber tags, in the form "20060507_118-1861.jpg".
@@ -7745,67 +7803,67 @@ the B<-geotag> option.)
7745
7803
 
7746
7804
  =over 5
7747
7805
 
7748
- =item exiftool -geotag track.log a.jpg
7806
+ =item C<exiftool -geotag track.log a.jpg>
7749
7807
 
7750
7808
  Geotag an image (C<a.jpg>) from position information in a GPS track log
7751
7809
  (C<track.log>). Since the C<Geotime> tag is not specified, the value of
7752
7810
  DateTimeOriginal is used for geotagging. Local system time is assumed
7753
7811
  unless DateTimeOriginal contains a timezone.
7754
7812
 
7755
- =item exiftool -geotag track.log -geolocate=geotag a.jpg
7813
+ =item C<exiftool -geotag track.log -geolocate=geotag a.jpg>
7756
7814
 
7757
7815
  Geotag an image and also write geolocation information of the nearest city
7758
7816
  (city name, state/province and country). Read here for more details about
7759
7817
  the Geolocation feature: L<https://exiftool.org/geolocation.html#Write>
7760
7818
 
7761
- =item exiftool -geotag t.log -geotime='2009:04:02 13:41:12-05:00' a.jpg
7819
+ =item C<exiftool -geotag t.log -geotime='2009:04:02 13:41:12-05:00' a.jpg>
7762
7820
 
7763
7821
  Geotag an image with the GPS position for a specific time.
7764
7822
 
7765
- =item exiftool -geotag log.gpx '-xmp:geotimeE<lt>createdate' dir
7823
+ =item C<exiftool -geotag log.gpx '-xmp:geotimeE<lt>createdate' dir>
7766
7824
 
7767
7825
  Geotag all images in directory C<dir> with XMP tags instead of EXIF tags,
7768
7826
  based on the image CreateDate.
7769
7827
 
7770
- =item exiftool -geotag a.log -geosync=-20 dir
7828
+ =item C<exiftool -geotag a.log -geosync=-20 dir>
7771
7829
 
7772
7830
  Geotag images in directory C<dir>, accounting for image timestamps which
7773
7831
  were 20 seconds ahead of GPS.
7774
7832
 
7775
- =item exiftool -geotag a.log -geosync=1.jpg -geosync=2.jpg dir
7833
+ =item C<exiftool -geotag a.log -geosync=1.jpg -geosync=2.jpg dir>
7776
7834
 
7777
7835
  Geotag images using time synchronization from two previously geotagged images
7778
7836
  (1.jpg and 2.jpg), synchronizing the image and GPS times using a linear time
7779
7837
  drift correction.
7780
7838
 
7781
- =item exiftool -geotag a.log '-geotimeE<lt>${createdate}+01:00' dir
7839
+ =item C<exiftool -geotag a.log '-geotimeE<lt>${createdate}+01:00' dir>
7782
7840
 
7783
7841
  Geotag images in C<dir> using CreateDate with the specified timezone. If
7784
7842
  CreateDate already contained a timezone, then the timezone specified on the
7785
7843
  command line is ignored.
7786
7844
 
7787
- =item exiftool -geotag= a.jpg
7845
+ =item C<exiftool -geotag= a.jpg>
7788
7846
 
7789
7847
  Delete GPS tags which may have been added by the geotag feature. Note that
7790
7848
  this does not remove all GPS tags -- to do this instead use C<-gps:all=>.
7791
7849
 
7792
- =item exiftool -xmp:geotag= a.jpg
7850
+ =item C<exiftool -xmp:geotag= a.jpg>
7793
7851
 
7794
7852
  Delete XMP GPS tags which were added by the geotag feature.
7795
7853
 
7796
- =item exiftool -xmp:geotag=track.log a.jpg
7854
+ =item C<exiftool -xmp:geotag=track.log a.jpg>
7797
7855
 
7798
7856
  Geotag an image with XMP tags, using the time from DateTimeOriginal.
7799
7857
 
7800
- =item exiftool -geotag a.log -geotag b.log -r dir
7858
+ =item C<exiftool -geotag a.log -geotag b.log -r dir>
7801
7859
 
7802
7860
  Combine multiple track logs and geotag an entire directory tree of images.
7803
7861
 
7804
- =item exiftool -geotag 'tracks/*.log' -r dir
7862
+ =item C<exiftool -geotag 'tracks/*.log' -r dir>
7805
7863
 
7806
7864
  Read all track logs from the C<tracks> directory.
7807
7865
 
7808
- =item exiftool -p gpx.fmt dir > out.gpx
7866
+ =item C<exiftool -p gpx.fmt dir E<gt> out.gpx>
7809
7867
 
7810
7868
  Generate a GPX track log from all images in directory C<dir>. This example
7811
7869
  uses the C<gpx.fmt> file included in the full ExifTool distribution package
@@ -7817,26 +7875,26 @@ and assumes that the images in C<dir> have all been previously geotagged.
7817
7875
 
7818
7876
  =over 5
7819
7877
 
7820
- =item cat a.jpg | exiftool -
7878
+ =item C<cat a.jpg | exiftool ->
7821
7879
 
7822
7880
  Extract information from stdin.
7823
7881
 
7824
- =item exiftool image.jpg -thumbnailimage -b | exiftool -
7882
+ =item C<exiftool image.jpg -thumbnailimage -b | exiftool ->
7825
7883
 
7826
7884
  Extract information from an embedded thumbnail image.
7827
7885
 
7828
- =item cat a.jpg | exiftool -iptc:keywords+=fantastic - > b.jpg
7886
+ =item C<cat a.jpg | exiftool -iptc:keywords+=fantastic - E<gt> b.jpg>
7829
7887
 
7830
7888
  Add an IPTC keyword in a pipeline, saving output to a new file.
7831
7889
 
7832
- =item curl -s http://a.domain.com/bigfile.jpg | exiftool -fast -
7890
+ =item C<curl -s http://a.domain.com/bigfile.jpg | exiftool -fast ->
7833
7891
 
7834
7892
  Extract information from an image over the internet using the cURL utility.
7835
7893
  The B<-fast> option prevents exiftool from scanning for trailer information,
7836
7894
  so only the meta information header is transferred.
7837
7895
 
7838
- =item exiftool a.jpg -thumbnailimage -b | exiftool -comment=wow - |
7839
- exiftool a.jpg -thumbnailimage'<=-'
7896
+ =item C<exiftool a.jpg -thumbnailimage -b | exiftool -comment=wow - |
7897
+ exiftool a.jpg -thumbnailimage'E<lt>=-'>
7840
7898
 
7841
7899
  Add a comment to an embedded thumbnail image. (Why anyone would want to do
7842
7900
  this I don't know, but I've included this as an example to illustrate the
@@ -7859,7 +7917,7 @@ the commands if B<-execute> was used).
7859
7917
 
7860
7918
  =head1 AUTHOR
7861
7919
 
7862
- Copyright 2003-2024, Phil Harvey
7920
+ Copyright 2003-2025, Phil Harvey
7863
7921
 
7864
7922
  This is free software; you can redistribute it and/or modify it under the
7865
7923
  same terms as Perl itself.