exiftool_vendored 12.06.0 → 12.12.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of exiftool_vendored might be problematic. Click here for more details.

Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +96 -2
  3. data/bin/MANIFEST +5 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +43 -42
  7. data/bin/exiftool +156 -82
  8. data/bin/lib/Image/ExifTool.pm +22 -13
  9. data/bin/lib/Image/ExifTool.pod +59 -50
  10. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +11 -5
  11. data/bin/lib/Image/ExifTool/Canon.pm +202 -13
  12. data/bin/lib/Image/ExifTool/DarwinCore.pm +9 -3
  13. data/bin/lib/Image/ExifTool/EXE.pm +8 -5
  14. data/bin/lib/Image/ExifTool/GIF.pm +2 -2
  15. data/bin/lib/Image/ExifTool/Geotag.pm +30 -11
  16. data/bin/lib/Image/ExifTool/GoPro.pm +47 -30
  17. data/bin/lib/Image/ExifTool/IPTC.pm +1 -0
  18. data/bin/lib/Image/ExifTool/Import.pm +14 -11
  19. data/bin/lib/Image/ExifTool/JSON.pm +27 -4
  20. data/bin/lib/Image/ExifTool/MPF.pm +2 -2
  21. data/bin/lib/Image/ExifTool/MacOS.pm +153 -37
  22. data/bin/lib/Image/ExifTool/Matroska.pm +3 -1
  23. data/bin/lib/Image/ExifTool/Minolta.pm +5 -1
  24. data/bin/lib/Image/ExifTool/Nikon.pm +11 -3
  25. data/bin/lib/Image/ExifTool/Olympus.pm +8 -1
  26. data/bin/lib/Image/ExifTool/Panasonic.pm +12 -12
  27. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -0
  28. data/bin/lib/Image/ExifTool/Pentax.pm +10 -3
  29. data/bin/lib/Image/ExifTool/QuickTime.pm +51 -16
  30. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +68 -45
  31. data/bin/lib/Image/ExifTool/README +5 -2
  32. data/bin/lib/Image/ExifTool/RSRC.pm +17 -11
  33. data/bin/lib/Image/ExifTool/Radiance.pm +7 -2
  34. data/bin/lib/Image/ExifTool/Sony.pm +56 -35
  35. data/bin/lib/Image/ExifTool/Stim.pm +2 -2
  36. data/bin/lib/Image/ExifTool/TagLookup.pm +5756 -5710
  37. data/bin/lib/Image/ExifTool/TagNames.pod +248 -49
  38. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +7 -6
  39. data/bin/lib/Image/ExifTool/Writer.pl +5 -3
  40. data/bin/lib/Image/ExifTool/XMP.pm +63 -18
  41. data/bin/lib/Image/ExifTool/XMP2.pl +1 -0
  42. data/bin/perl-Image-ExifTool.spec +42 -41
  43. data/lib/exiftool_vendored/version.rb +1 -1
  44. metadata +7 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b6fbacc803486908bf63bd351d8ea3d31bbe0cf1217b6bbab9ef074cde3f0ee3
4
- data.tar.gz: fcb3492aae1fbdf6587a73ea5546eed530c09ac20c67fc1a77057becd1e87b0b
3
+ metadata.gz: fb85849da2fdeb7f34dcbd03ba9548e5744c692f93d8163cf3029a5189f75d2c
4
+ data.tar.gz: 0fd722ec987c17f4449f7eb9d18101286ceff673134d784833acd811cd376a09
5
5
  SHA512:
6
- metadata.gz: 7101bbb72920052732e86bb2c44b828bbb901f89363768ebc5346d5225db5919e79de5de2ca8b0af2c77ccd6d62a9f2bf677c61479b877d06fecb88bbd8b29f8
7
- data.tar.gz: 0d08e16271b5bd6fe9c4f9d154190a799b3d4bd3b3bdd777a42afa4b29786595869a3068fbc213a68135559d275bcfcf07a08f22d9fdc242130770905ca826cc
6
+ metadata.gz: 8273b84dd45c1b266eec1a0c13c14e0c60e6f68c3bbd76fce169002a9983606b76f70e636199b751dda2f8f6992ea39b164f4d24c29849fa494b30b4ad14b1fa
7
+ data.tar.gz: a65c0a97fdbc17365a46bd7605b36e72557004549f92ba9fc1f02d7358899643932125a499d65daa88eddebbf9c7a8d343c037b70baa4ff30802c97dfb66efd6
@@ -7,8 +7,102 @@ RSS feed: https://exiftool.org/rss.xml
7
7
  Note: The most recent production release is Version 12.00. (Other versions are
8
8
  considered development releases, and are not uploaded to CPAN.)
9
9
 
10
- (I'll be on vacation from Aug 26 to Sep 3, 2020 so don't expect any
11
- forum or email responses from me during this time - Phil H.)
10
+ Dec. 4, 2020 - Version 12.12
11
+
12
+ - Added ability to geotag from DJI CSV log files
13
+ - Added a new CanonModelID
14
+ - Added a couple of new Sony LensType values (thanks LibRaw)
15
+ - Enhanced -csvDelim option to allow "\t", "\n", "\r" and "\\"
16
+ - Unescape "\b" and "\f" in imported JSON values
17
+ - Fixed bug introduced in 12.10 which generated a "Not an integer" warning
18
+ when attempting to shift some QuickTime date/time tags
19
+ - Fixed shared-write permission problem with -@ argfile when using -stay_open
20
+ and a filename containing special characters on Windows
21
+
22
+ Nov. 27, 2020 - Version 12.11
23
+
24
+ - Added -csvDelim option
25
+ - Added new Canon and Olympus LensType values (thanks LibRaw)
26
+ - Added a warning if ICC_Profile is deleted from an image (github issue #63)
27
+ - EndDir() function for -if option now works when -fileOrder is used
28
+ - Changed FileSize conversion to use binary prefixes since that is how the
29
+ conversion is currently done (eg. MiB instead of MB)
30
+ - Patched -csv option so columns aren't resorted when using -G option and one
31
+ of the tags is missing from a file
32
+ - Fixed incompatiblity with Google Photos when writing UserData:GPSCoordinates
33
+ to MP4 videos
34
+ - Fixed problem where the tags available in a -p format string were limited to
35
+ the same as the -if[NUM] option when NUM was specified
36
+ - Fixed incorrect decoding of SourceFileIndex/SourceDirectoryIndex for Ricoh
37
+ models
38
+
39
+ Nov. 12, 2020 - Version 12.10
40
+
41
+ - Added -validate test for proper TIFF magic number in JPEG EXIF header
42
+ - Added support for Nikon Z7 LensData version 0801
43
+ - Added a new XMP-GPano tag
44
+ - Decode ColorData for the Canon EOS 1DXmkIII (thanks LibRaw)
45
+ - Decode more tags for the Sony ILCE-7SM3 (thanks Jos Roost)
46
+ - Automatically apply QuickTimeUTC option for CR3 files
47
+ - Improved decoding of XAttrMDLabel from MacOS files
48
+ - Ignore time zones when writing date/time values and using the -d option
49
+ - Enhanced -echo3 and -echo4 options to allow exit status to be returned
50
+ - Changed -execute so the -q option no longer suppresses the "{ready}" message
51
+ when a synchronization number is used (eg. -execute123)
52
+
53
+ Oct. 29, 2020 - Version 12.09
54
+
55
+ - Added ability to copy CanonMakerNotes from CR3 images to other file types
56
+ - Added read support for ON1 presets file (.ONP)
57
+ - Added two new CanonModelID values
58
+ - Added trailing "/" when writing QuickTime:GPSCoordinates
59
+ - Added a number of new XMP-crs tags
60
+ - Added a new Sony LensType (thanks Jos Roost)
61
+ - Added a new Nikon Z lens (thanks LibRaw)
62
+ - Added a new Canon LensType
63
+ - Decode ColorData for Canon EOS R5/R6
64
+ - Decode a couple of new HEIF tags
65
+ - Decode FirmwareVersion for Canon M50
66
+ - Improved decoding of Sony CreativeStyle tags (thanks Jos Roost)
67
+ - Improved parsing of Radiance files to recognize comments
68
+ - Renamed GIF AspectRatio tag to PixelAspectRatio
69
+ - Patched EndDir() feature so subdirectories are always processed when -r is
70
+ used (previously, EndDir() would end processing of a directory completely)
71
+ - Yet another tweak to the EventTime formatting rules (also allow time-only
72
+ values with fractional seconds and a time zone)
73
+ - Avoid loading GoPro module unnecessarily when reading MP4 videos from some
74
+ other cameras
75
+ - Fixed problem with an incorrect naming of CodecID tags in some MKV videos
76
+ - Fixed verbose output to avoid "adding" messages for existing flattened XMP
77
+ tags
78
+
79
+ Oct. 15, 2020 - Version 12.08
80
+
81
+ - Added read support for MacOS "._" sidecar files
82
+ - Added a new Sony LensType (thanks Jos Roost)
83
+ - Recognize Mac OS X xattr files
84
+ - Extract ThumbnailImage from MP4 videos of more dashcam models
85
+ - Improved decoding of a number of Sony tags (thanks Jos Roost)
86
+ - Fixed problem where the special -if EndDir() function didn't work properly
87
+ for directories after the one in which it was initially called
88
+ - Patched to read DLL files which don't have a .rsrc section (thanks Hank)
89
+ - Patched to support new IGC date format when geotagging
90
+ - Patched to read DLL files with an invalid size in the header
91
+
92
+ Oct. 2, 2020 - Version 12.07
93
+
94
+ - Added support for GoPro .360 videos
95
+ - Added some new Canon RF and Nikkor Z lenses (thanks LibRaw)
96
+ - Added some new Sony LensType and CreativeStyle values and decode some
97
+ ILCE-7C tags (thanks Jos Roost)
98
+ - Added a number of new Olympus SceneMode values (thanks Herb)
99
+ - Added a new Nikon LensID
100
+ - Decode more timed metadata from Insta360 videos (thanks Thomas Allen)
101
+ - Decode timed GPS from videos of more Garmin dashcam models
102
+ - Decode a new GoPro video tag
103
+ - Reformat time-only EventTime values when writing and prevent arbitrary
104
+ strings from being written
105
+ - Patched to accept backslashes in SourceFile entries for -csv option
12
106
 
13
107
  Sept. 11, 2020 - Version 12.06
14
108
 
@@ -567,6 +567,7 @@ t/GeoTiff_4.out
567
567
  t/Geotag.t
568
568
  t/Geotag_10.out
569
569
  t/Geotag_11.out
570
+ t/Geotag_12.out
570
571
  t/Geotag_2.out
571
572
  t/Geotag_3.out
572
573
  t/Geotag_5.out
@@ -652,6 +653,8 @@ t/MWG_6.out
652
653
  t/MWG_7.out
653
654
  t/MXF.t
654
655
  t/MXF_2.out
656
+ t/MacOS.t
657
+ t/MacOS_2.out
655
658
  t/Matroska.t
656
659
  t/Matroska_2.out
657
660
  t/Minolta.t
@@ -984,6 +987,7 @@ t/images/Geotag.log
984
987
  t/images/Geotag.xml
985
988
  t/images/Geotag2.log
986
989
  t/images/Geotag3.log
990
+ t/images/Geotag_DJI_2020-12-02_[07-50-31].csv
987
991
  t/images/GoPro.jpg
988
992
  t/images/HTML.html
989
993
  t/images/ICC_Profile.icc
@@ -1007,6 +1011,7 @@ t/images/MOI.moi
1007
1011
  t/images/MP3.mp3
1008
1012
  t/images/MWG.jpg
1009
1013
  t/images/MXF.mxf
1014
+ t/images/MacOS.macos
1010
1015
  t/images/Matroska.mkv
1011
1016
  t/images/Minolta.jpg
1012
1017
  t/images/Minolta.mrw
@@ -47,5 +47,5 @@
47
47
  }
48
48
  },
49
49
  "release_status" : "stable",
50
- "version" : "12.06"
50
+ "version" : "12.12"
51
51
  }
@@ -28,4 +28,4 @@ recommends:
28
28
  Time::HiRes: 0
29
29
  requires:
30
30
  perl: 5.004
31
- version: 12.06
31
+ version: 12.12
data/bin/README CHANGED
@@ -14,46 +14,47 @@ supported by ExifTool (r = read, w = write, c = create):
14
14
 
15
15
  File Types
16
16
  ------------+-------------+-------------+-------------+------------
17
- 3FR r | DPX r | ISO r | O r | RAW r/w
18
- 3G2 r/w | DR4 r/w/c | ITC r | ODP r | RIFF r
19
- 3GP r/w | DSS r | J2C r | ODS r | RSRC r
20
- A r | DV r | JNG r/w | ODT r | RTF r
21
- AA r | DVB r/w | JP2 r/w | OFR r | RW2 r/w
22
- AAE r | DVR-MS r | JPEG r/w | OGG r | RWL r/w
23
- AAX r/w | DYLIB r | JSON r | OGV r | RWZ r
24
- ACR r | EIP r | K25 r | OPUS r | RM r
25
- AFM r | EPS r/w | KDC r | ORF r/w | SEQ r
26
- AI r/w | EPUB r | KEY r | OTF r | SKETCH r
27
- AIFF r | ERF r/w | LA r | PAC r | SO r
28
- APE r | EXE r | LFP r | PAGES r | SR2 r/w
29
- ARQ r/w | EXIF r/w/c | LNK r | PBM r/w | SRF r
30
- ARW r/w | EXR r | LRV r/w | PCD r | SRW r/w
31
- ASF r | EXV r/w/c | M2TS r | PCX r | SVG r
32
- AVI r | F4A/V r/w | M4A/V r/w | PDB r | SWF r
33
- AVIF r/w | FFF r/w | MAX r | PDF r/w | THM r/w
34
- AZW r | FITS r | MEF r/w | PEF r/w | TIFF r/w
35
- BMP r | FLA r | MIE r/w/c | PFA r | TORRENT r
36
- BPG r | FLAC r | MIFF r | PFB r | TTC r
37
- BTF r | FLIF r/w | MKA r | PFM r | TTF r
38
- CHM r | FLV r | MKS r | PGF r | TXT r
39
- COS r | FPF r | MKV r | PGM r/w | VCF r
40
- CR2 r/w | FPX r | MNG r/w | PLIST r | VRD r/w/c
41
- CR3 r/w | GIF r/w | MOBI r | PICT r | VSD r
42
- CRM r/w | GPR r/w | MODD r | PMP r | WAV r
43
- CRW r/w | GZ r | MOI r | PNG r/w | WDP r/w
44
- CS1 r/w | HDP r/w | MOS r/w | PPM r/w | WEBP r
45
- CSV r | HDR r | MOV r/w | PPT r | WEBM r
46
- CZI r | HEIC r/w | MP3 r | PPTX r | WMA r
47
- DCM r | HEIF r/w | MP4 r/w | PS r/w | WMV r
48
- DCP r/w | HTML r | MPC r | PSB r/w | WTV r
49
- DCR r | ICC r/w/c | MPG r | PSD r/w | WV r
50
- DFONT r | ICS r | MPO r/w | PSP r | X3F r/w
51
- DIVX r | IDML r | MQV r/w | QTIF r/w | XCF r
52
- DJVU r | IIQ r/w | MRW r/w | R3D r | XLS r
53
- DLL r | IND r/w | MXF r | RA r | XLSX r
54
- DNG r/w | INSP r/w | NEF r/w | RAF r/w | XMP r/w/c
55
- DOC r | INSV r | NRW r/w | RAM r | ZIP r
56
- DOCX r | INX r | NUMBERS r | RAR r |
17
+ 360 r/w | DPX r | ITC r | ODP r | RIFF r
18
+ 3FR r | DR4 r/w/c | J2C r | ODS r | RSRC r
19
+ 3G2 r/w | DSS r | JNG r/w | ODT r | RTF r
20
+ 3GP r/w | DV r | JP2 r/w | OFR r | RW2 r/w
21
+ A r | DVB r/w | JPEG r/w | OGG r | RWL r/w
22
+ AA r | DVR-MS r | JSON r | OGV r | RWZ r
23
+ AAE r | DYLIB r | K25 r | ONP r | RM r
24
+ AAX r/w | EIP r | KDC r | OPUS r | SEQ r
25
+ ACR r | EPS r/w | KEY r | ORF r/w | SKETCH r
26
+ AFM r | EPUB r | LA r | OTF r | SO r
27
+ AI r/w | ERF r/w | LFP r | PAC r | SR2 r/w
28
+ AIFF r | EXE r | LNK r | PAGES r | SRF r
29
+ APE r | EXIF r/w/c | LRV r/w | PBM r/w | SRW r/w
30
+ ARQ r/w | EXR r | M2TS r | PCD r | SVG r
31
+ ARW r/w | EXV r/w/c | M4A/V r/w | PCX r | SWF r
32
+ ASF r | F4A/V r/w | MACOS r | PDB r | THM r/w
33
+ AVI r | FFF r/w | MAX r | PDF r/w | TIFF r/w
34
+ AVIF r/w | FITS r | MEF r/w | PEF r/w | TORRENT r
35
+ AZW r | FLA r | MIE r/w/c | PFA r | TTC r
36
+ BMP r | FLAC r | MIFF r | PFB r | TTF r
37
+ BPG r | FLIF r/w | MKA r | PFM r | TXT r
38
+ BTF r | FLV r | MKS r | PGF r | VCF r
39
+ CHM r | FPF r | MKV r | PGM r/w | VRD r/w/c
40
+ COS r | FPX r | MNG r/w | PLIST r | VSD r
41
+ CR2 r/w | GIF r/w | MOBI r | PICT r | WAV r
42
+ CR3 r/w | GPR r/w | MODD r | PMP r | WDP r/w
43
+ CRM r/w | GZ r | MOI r | PNG r/w | WEBP r
44
+ CRW r/w | HDP r/w | MOS r/w | PPM r/w | WEBM r
45
+ CS1 r/w | HDR r | MOV r/w | PPT r | WMA r
46
+ CSV r | HEIC r/w | MP3 r | PPTX r | WMV r
47
+ CZI r | HEIF r/w | MP4 r/w | PS r/w | WTV r
48
+ DCM r | HTML r | MPC r | PSB r/w | WV r
49
+ DCP r/w | ICC r/w/c | MPG r | PSD r/w | X3F r/w
50
+ DCR r | ICS r | MPO r/w | PSP r | XCF r
51
+ DFONT r | IDML r | MQV r/w | QTIF r/w | XLS r
52
+ DIVX r | IIQ r/w | MRW r/w | R3D r | XLSX r
53
+ DJVU r | IND r/w | MXF r | RA r | XMP r/w/c
54
+ DLL r | INSP r/w | NEF r/w | RAF r/w | ZIP r
55
+ DNG r/w | INSV r | NRW r/w | RAM r |
56
+ DOC r | INX r | NUMBERS r | RAR r |
57
+ DOCX r | ISO r | O r | RAW r/w |
57
58
 
58
59
  Meta Information
59
60
  ----------------------+----------------------+---------------------
@@ -105,8 +106,8 @@ your home directory, then you would type the following commands in a
105
106
  terminal window to extract and run ExifTool:
106
107
 
107
108
  cd ~/Desktop
108
- gzip -dc Image-ExifTool-12.06.tar.gz | tar -xf -
109
- cd Image-ExifTool-12.06
109
+ gzip -dc Image-ExifTool-12.12.tar.gz | tar -xf -
110
+ cd Image-ExifTool-12.12
110
111
  ./exiftool t/images/ExifTool.jpg
111
112
 
112
113
  Note: These commands extract meta information from one of the test images.
@@ -10,7 +10,7 @@
10
10
  use strict;
11
11
  require 5.004;
12
12
 
13
- my $version = '12.06';
13
+ my $version = '12.12';
14
14
 
15
15
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
16
16
  my $exeDir;
@@ -136,12 +136,13 @@ my $countSameWr; # count files written OK but not changed
136
136
  my $critical; # flag for critical operations (disable CTRL-C)
137
137
  my $csv; # flag for CSV option (set to "CSV", or maybe "JSON" when writing)
138
138
  my $csvAdd; # flag to add CSV information to existing lists
139
+ my $csvDelim; # delimiter for CSV files
139
140
  my $csvSaveCount; # save counter for last CSV file loaded
140
141
  my $deleteOrig; # 0=restore original files, 1=delete originals, 2=delete w/o asking
141
142
  my $disableOutput; # flag to disable normal output
142
143
  my $doSetFileName; # flag set if FileName may be written
143
144
  my $doUnzip; # flag to extract info from .gz and .bz2 files
144
- my ($end,$endDir); # flags to end processing
145
+ my ($end,$endDir,%endDir); # flags to end processing
145
146
  my $escapeC; # C-style escape
146
147
  my $escapeHTML; # flag to escape printed values for html
147
148
  my $evalWarning; # warning from eval
@@ -239,6 +240,7 @@ my %optArgs = (
239
240
  '-c' => 1, '-coordformat' => 1,
240
241
  '-charset' => 0, # (optional arg; OK because arg cannot begin with "-")
241
242
  '-config' => 1,
243
+ '-csvdelim' => 1,
242
244
  '-d' => 1, '-dateformat' => 1,
243
245
  '-D' => 0, # necessary to avoid matching lower-case equivalent
244
246
  '-echo' => 1, '-echo1' => 1, '-echo2' => 1, '-echo3' => 1, '-echo4' => 1,
@@ -246,11 +248,12 @@ my %optArgs = (
246
248
  '-efile!' => 1, '-efile1!' => 1, '-efile2!' => 1, '-efile3!' => 1, '-efile4!' => 1,
247
249
  '-ext' => 1, '--ext' => 1, '-ext+' => 1, '--ext+' => 1,
248
250
  '-extension' => 1, '--extension' => 1, '-extension+' => 1, '--extension+' => 1,
249
- '-fileorder' => 1,
251
+ '-fileorder' => 1, '-fileorder0' => 1, '-fileorder1' => 1, '-fileorder2' => 1,
252
+ '-fileorder3' => 1, '-fileorder4' => 1, '-fileorder5' => 1,
250
253
  '-geotag' => 1,
251
254
  '-globaltimeshift' => 1,
252
255
  '-i' => 1, '-ignore' => 1,
253
- '-if' => 1, '-if0' => 1, '-if1' => 1, '-if2' => 1, '-if3' => 1, '-if4' => 1,
256
+ '-if' => 1, '-if0' => 1, '-if1' => 1, '-if2' => 1, '-if3' => 1, '-if4' => 1, '-if5' => 1,
254
257
  '-lang' => 0, # (optional arg; cannot begin with "-")
255
258
  '-listitem' => 1,
256
259
  '-o' => 1, '-out' => 1,
@@ -366,13 +369,21 @@ if (grep /^-common_args$/i, @ARGV) {
366
369
  # loop over sets of command-line arguments separated by "-execute"
367
370
  Command: for (;;) {
368
371
 
369
- @echo3 and print STDOUT join("\n", @echo3), "\n";
370
- @echo4 and print STDERR join("\n", @echo4), "\n";
372
+ if (@echo3) {
373
+ my $str = join "\n", @echo3, "\n";
374
+ $str =~ s/\$\{status\}/$rtnVal/ig;
375
+ print STDOUT $str;
376
+ }
377
+ if (@echo4) {
378
+ my $str = join "\n", @echo4, "\n";
379
+ $str =~ s/\$\{status\}/$rtnVal/ig;
380
+ print STDERR $str;
381
+ }
371
382
 
372
383
  $rafStdin->Close() if $rafStdin;
373
384
  undef $rafStdin;
374
385
 
375
- # save or previous return codes
386
+ # save our previous return codes
376
387
  $rtnValPrev = $rtnVal;
377
388
  $rtnValApp = $rtnVal if $rtnVal;
378
389
 
@@ -387,7 +398,7 @@ if ($binaryStdout) {
387
398
 
388
399
  # flush console and print "{ready}" message if -stay_open is in effect
389
400
  if ($stayOpen >= 2) {
390
- if ($quiet) {
401
+ if ($quiet and not defined $executeID) {
391
402
  # flush output if possible
392
403
  eval { require IO::Handle } and STDERR->flush(), STDOUT->flush();
393
404
  } else {
@@ -421,6 +432,7 @@ undef %countLink;
421
432
  undef %created;
422
433
  undef %csvTags;
423
434
  undef %database;
435
+ undef %endDir;
424
436
  undef %filterExt;
425
437
  undef %ignore;
426
438
  undef %printFmt;
@@ -492,6 +504,7 @@ $countGoodCr = 0;
492
504
  $countGoodWr = 0;
493
505
  $countNewDir = 0;
494
506
  $countSameWr = 0;
507
+ $csvDelim = ',';
495
508
  $csvSaveCount = 0;
496
509
  $fileTrailer = '';
497
510
  $filterFlag = 0;
@@ -554,7 +567,7 @@ if (not $preserveTime and $^O eq 'MSWin32') {
554
567
  for (;;) {
555
568
 
556
569
  # execute the command now if no more arguments or -execute is used
557
- if (not @ARGV or ($ARGV[0] =~ /^(-|\xe2\x88\x92)execute(\d*)$/i and not $endOfOpts)) {
570
+ if (not @ARGV or ($ARGV[0] =~ /^(-|\xe2\x88\x92)execute(\d+)?$/i and not $endOfOpts)) {
558
571
  if (@ARGV) {
559
572
  $executeID = $2; # save -execute number for "{ready}" response
560
573
  $helped = 1; # don't show help if we used -execute
@@ -813,7 +826,7 @@ for (;;) {
813
826
  next;
814
827
  }
815
828
  /^config$/i and Warn("Ignored -config option (not first on command line)\n"), shift, next;
816
- if (/^csv(\+?=.*)?/i) {
829
+ if (/^csv(\+?=.*)?$/i) {
817
830
  my $csvFile = $1;
818
831
  # must process on 2nd pass so -f and -charset options are available
819
832
  unless ($pass) {
@@ -833,7 +846,7 @@ for (;;) {
833
846
  if ($mt->Open(\*CSVFILE, $csvFile)) {
834
847
  binmode CSVFILE;
835
848
  require Image::ExifTool::Import;
836
- $msg = Image::ExifTool::Import::ReadCSV(\*CSVFILE, \%database, $forcePrint);
849
+ $msg = Image::ExifTool::Import::ReadCSV(\*CSVFILE, \%database, $forcePrint, $csvDelim);
837
850
  close(CSVFILE);
838
851
  } else {
839
852
  $msg = "Error opening CSV file '${csvFile}'";
@@ -844,6 +857,15 @@ for (;;) {
844
857
  $csv = 'CSV';
845
858
  next;
846
859
  }
860
+ if (/^csvdelim$/i) {
861
+ $csvDelim = shift;
862
+ defined $csvDelim or Error("Expecting argument for -csvDelim option\n"), $badCmd=1, next;
863
+ $csvDelim =~ /"/ and Error("CSV delimiter can not contain a double quote\n"), $badCmd=1, next;
864
+ my %unescape = ( 't'=>"\t", 'n'=>"\n", 'r'=>"\r", '\\' => '\\' );
865
+ $csvDelim =~ s/\\(.)/$unescape{$1}||"\\$1"/sge;
866
+ $mt->Options(CSVDelim => $csvDelim);
867
+ next;
868
+ }
847
869
  if (/^d$/ or $a eq 'dateformat') {
848
870
  my $fmt = shift;
849
871
  $fmt or Error("Expecting date format for -d option\n"), $badCmd=1, next;
@@ -1758,10 +1780,12 @@ if (@dbKeys) {
1758
1780
  undef $evalWarning;
1759
1781
  local $SIG{'__WARN__'} = sub { $evalWarning = $_[0] };
1760
1782
  foreach (@dbKeys) {
1783
+ my $db = $database{$_};
1784
+ tr/\\/\// and $database{$_} = $db; # allow for backslashes in SourceFile
1761
1785
  # (punt on using ConvertFileName here, so $absPath may be a mix of encodings)
1762
1786
  my $absPath = AbsPath($_);
1763
1787
  if (defined $absPath) {
1764
- $database{$absPath} = $database{$_} unless $database{$absPath};
1788
+ $database{$absPath} = $db unless $database{$absPath};
1765
1789
  if ($verbose and $verbose > 1) {
1766
1790
  print $vout "Imported entry for '${_}' (full path: '${absPath}')\n";
1767
1791
  }
@@ -1972,6 +1996,7 @@ sub GetImageInfo($$)
1972
1996
  }
1973
1997
  last unless $result;
1974
1998
  }
1999
+ undef @foundTags if $fastCondition; # ignore if we didn't get all tags
1975
2000
  }
1976
2001
  unless ($result) {
1977
2002
  $verbose and print $vout "-------- $file (failed condition)$progStr\n";
@@ -2225,7 +2250,9 @@ sub GetImageInfo($$)
2225
2250
  my $noDups = ($json or ($xml and $outFormat > 0));
2226
2251
  my $printConv = $et->Options('PrintConv');
2227
2252
  my $lastGroup = '';
2253
+ my $i = -1;
2228
2254
  TAG: foreach $tag (@foundTags) {
2255
+ ++$i; # keep track on index in @foundTags
2229
2256
  my $tagName = GetTagName($tag);
2230
2257
  my ($group, $valList);
2231
2258
  # get the value for this tag
@@ -2343,26 +2370,38 @@ TAG: foreach $tag (@foundTags) {
2343
2370
  }
2344
2371
  # save information for CSV output
2345
2372
  if ($csv) {
2346
- my $t = $group ? "$group:$tagName" : $tagName;
2347
- $t .= '#' if $tag =~ /#/; # add ValueConv "#" suffix if used
2373
+ my $tn = $tagName;
2374
+ $tn .= '#' if $tag =~ /#/; # add ValueConv "#" suffix if used
2375
+ my $gt = $group ? "$group:$tn" : $tn;
2348
2376
  # (tag-name case may be different if some tags don't exist
2349
2377
  # in a file, so all logic must use lower-case tag names)
2350
- my $lcTag = lc $t;
2378
+ my $lcTag = lc $gt;
2351
2379
  # override existing entry only if top priority
2352
2380
  next if defined $csvInfo{$lcTag} and $tag =~ /\(/;
2353
2381
  $csvInfo{$lcTag} = $val;
2354
2382
  if (defined $csvTags{$lcTag}) {
2355
2383
  # overwrite with actual extracted tag name
2356
2384
  # (note: can't check "if defined $val" here because -f may be used)
2357
- $csvTags{$lcTag} = $t if defined $$info{$tag};
2358
- } else {
2359
- # (don't save unextracted tag name unless -f was used)
2360
- $csvTags{$lcTag} = defined($val) ? $t : '';
2361
- if (@csvFiles == 1) {
2362
- push @csvTags, $lcTag; # save order of tags for first file
2363
- } elsif (@csvTags) {
2364
- undef @csvTags;
2365
- }
2385
+ $csvTags{$lcTag} = $gt if defined $$info{$tag};
2386
+ next;
2387
+ }
2388
+ # must check for "Unknown" group (for tags that don't exist)
2389
+ if ($group and defined $csvTags[$i] and $csvTags[$i] =~ /^(.*):$tn$/i) {
2390
+ next if $group eq 'Unknown'; # nothing more to do if we don't know tag group
2391
+ if ($1 eq 'unknown') {
2392
+ # replace unknown entry in CSV tag lookup and list
2393
+ delete $csvTags{$csvTags[$i]};
2394
+ $csvTags{$lcTag} = defined($val) ? $gt : '';
2395
+ $csvTags[$i] = $lcTag;
2396
+ next;
2397
+ }
2398
+ }
2399
+ # (don't save unextracted tag name unless -f was used)
2400
+ $csvTags{$lcTag} = defined($val) ? $gt : '';
2401
+ if (@csvFiles == 1) {
2402
+ push @csvTags, $lcTag; # save order of tags for first file
2403
+ } elsif (@csvTags) {
2404
+ undef @csvTags;
2366
2405
  }
2367
2406
  next;
2368
2407
  }
@@ -3288,7 +3327,7 @@ sub FormatCSV($)
3288
3327
  # the -b option is used to encode as Base64. It is unclear whether or not this
3289
3328
  # is valid CSV, but some readers may not like it. (If this becomes a problem,
3290
3329
  # in the future values may need to be truncated at the first NULL character.)
3291
- $val = qq{"$val"} if $val =~ s/"/""/g or $val =~ /(^\s+|\s+$)/ or $val =~ /[,\n\r]/;
3330
+ $val = qq{"$val"} if $val =~ s/"/""/g or $val =~ /(^\s+|\s+$)/ or $val =~ /[\n\r]|\Q$csvDelim/;
3292
3331
  return $val;
3293
3332
  }
3294
3333
 
@@ -3301,9 +3340,9 @@ sub PrintCSV()
3301
3340
  @csvTags or @csvTags = sort keys %csvTags;
3302
3341
  # make a list of tags actually found
3303
3342
  foreach $lcTag (@csvTags) {
3304
- push @tags, $csvTags{$lcTag} if $csvTags{$lcTag};
3343
+ push @tags, FormatCSV($csvTags{$lcTag}) if $csvTags{$lcTag};
3305
3344
  }
3306
- print join(',', 'SourceFile', @tags), "\n";
3345
+ print join($csvDelim, 'SourceFile', @tags), "\n";
3307
3346
  my $empty = defined($forcePrint) ? $forcePrint : '';
3308
3347
  foreach $file (@csvFiles) {
3309
3348
  my @vals = (FormatCSV($file)); # start with full file name
@@ -3314,7 +3353,7 @@ sub PrintCSV()
3314
3353
  defined $val or push(@vals,$empty), next;
3315
3354
  push @vals, FormatCSV($val);
3316
3355
  }
3317
- print join(',', @vals), "\n";
3356
+ print join($csvDelim, @vals), "\n";
3318
3357
  }
3319
3358
  }
3320
3359
 
@@ -3550,8 +3589,18 @@ sub ProcessFiles($;$)
3550
3589
  if ($list) {
3551
3590
  push(@$list, $file);
3552
3591
  } else {
3592
+ if (%endDir) {
3593
+ my ($d, $f) = Image::ExifTool::SplitFileName($file);
3594
+ next if $endDir{$d};
3595
+ }
3553
3596
  GetImageInfo($et, $file);
3554
3597
  $end and Warn("End called - $file\n");
3598
+ if ($endDir) {
3599
+ Warn("EndDir called - $file\n");
3600
+ my ($d, $f) = Image::ExifTool::SplitFileName($file);
3601
+ $endDir{$d} = 1;
3602
+ undef $endDir;
3603
+ }
3555
3604
  }
3556
3605
  }
3557
3606
  $et->Options(CharsetFileName => $enc) if $utf8FileName{$file};
@@ -3566,7 +3615,7 @@ sub ScanDir($$;$)
3566
3615
  {
3567
3616
  local $_;
3568
3617
  my ($et, $dir, $list) = @_;
3569
- my (@fileList, $done, $file, $utf8Name, $winSurrogate);
3618
+ my (@fileList, $done, $file, $utf8Name, $winSurrogate, $endThisDir);
3570
3619
  my $enc = $et->Options('CharsetFileName');
3571
3620
  # recode as UTF-8 if necessary
3572
3621
  if ($enc) {
@@ -3636,6 +3685,7 @@ sub ScanDir($$;$)
3636
3685
  last if $end;
3637
3686
  next;
3638
3687
  }
3688
+ next if $endThisDir;
3639
3689
  # apply rules from -ext options
3640
3690
  my $accepted;
3641
3691
  if ($filterFlag) {
@@ -3678,9 +3728,11 @@ sub ScanDir($$;$)
3678
3728
  last;
3679
3729
  }
3680
3730
  if ($endDir) {
3681
- $dir =~ s(/$)();
3731
+ $path =~ s(/$)();
3682
3732
  Warn("EndDir called - $path\n");
3683
- last;
3733
+ $endDir{$path} = 1;
3734
+ $endThisDir = 1;
3735
+ undef $endDir;
3684
3736
  }
3685
3737
  }
3686
3738
  }
@@ -4384,46 +4436,47 @@ supported by ExifTool (r = read, w = write, c = create):
4384
4436
 
4385
4437
  File Types
4386
4438
  ------------+-------------+-------------+-------------+------------
4387
- 3FR r | DPX r | ISO r | O r | RAW r/w
4388
- 3G2 r/w | DR4 r/w/c | ITC r | ODP r | RIFF r
4389
- 3GP r/w | DSS r | J2C r | ODS r | RSRC r
4390
- A r | DV r | JNG r/w | ODT r | RTF r
4391
- AA r | DVB r/w | JP2 r/w | OFR r | RW2 r/w
4392
- AAE r | DVR-MS r | JPEG r/w | OGG r | RWL r/w
4393
- AAX r/w | DYLIB r | JSON r | OGV r | RWZ r
4394
- ACR r | EIP r | K25 r | OPUS r | RM r
4395
- AFM r | EPS r/w | KDC r | ORF r/w | SEQ r
4396
- AI r/w | EPUB r | KEY r | OTF r | SKETCH r
4397
- AIFF r | ERF r/w | LA r | PAC r | SO r
4398
- APE r | EXE r | LFP r | PAGES r | SR2 r/w
4399
- ARQ r/w | EXIF r/w/c | LNK r | PBM r/w | SRF r
4400
- ARW r/w | EXR r | LRV r/w | PCD r | SRW r/w
4401
- ASF r | EXV r/w/c | M2TS r | PCX r | SVG r
4402
- AVI r | F4A/V r/w | M4A/V r/w | PDB r | SWF r
4403
- AVIF r/w | FFF r/w | MAX r | PDF r/w | THM r/w
4404
- AZW r | FITS r | MEF r/w | PEF r/w | TIFF r/w
4405
- BMP r | FLA r | MIE r/w/c | PFA r | TORRENT r
4406
- BPG r | FLAC r | MIFF r | PFB r | TTC r
4407
- BTF r | FLIF r/w | MKA r | PFM r | TTF r
4408
- CHM r | FLV r | MKS r | PGF r | TXT r
4409
- COS r | FPF r | MKV r | PGM r/w | VCF r
4410
- CR2 r/w | FPX r | MNG r/w | PLIST r | VRD r/w/c
4411
- CR3 r/w | GIF r/w | MOBI r | PICT r | VSD r
4412
- CRM r/w | GPR r/w | MODD r | PMP r | WAV r
4413
- CRW r/w | GZ r | MOI r | PNG r/w | WDP r/w
4414
- CS1 r/w | HDP r/w | MOS r/w | PPM r/w | WEBP r
4415
- CSV r | HDR r | MOV r/w | PPT r | WEBM r
4416
- CZI r | HEIC r/w | MP3 r | PPTX r | WMA r
4417
- DCM r | HEIF r/w | MP4 r/w | PS r/w | WMV r
4418
- DCP r/w | HTML r | MPC r | PSB r/w | WTV r
4419
- DCR r | ICC r/w/c | MPG r | PSD r/w | WV r
4420
- DFONT r | ICS r | MPO r/w | PSP r | X3F r/w
4421
- DIVX r | IDML r | MQV r/w | QTIF r/w | XCF r
4422
- DJVU r | IIQ r/w | MRW r/w | R3D r | XLS r
4423
- DLL r | IND r/w | MXF r | RA r | XLSX r
4424
- DNG r/w | INSP r/w | NEF r/w | RAF r/w | XMP r/w/c
4425
- DOC r | INSV r | NRW r/w | RAM r | ZIP r
4426
- DOCX r | INX r | NUMBERS r | RAR r |
4439
+ 360 r/w | DPX r | ITC r | ODP r | RIFF r
4440
+ 3FR r | DR4 r/w/c | J2C r | ODS r | RSRC r
4441
+ 3G2 r/w | DSS r | JNG r/w | ODT r | RTF r
4442
+ 3GP r/w | DV r | JP2 r/w | OFR r | RW2 r/w
4443
+ A r | DVB r/w | JPEG r/w | OGG r | RWL r/w
4444
+ AA r | DVR-MS r | JSON r | OGV r | RWZ r
4445
+ AAE r | DYLIB r | K25 r | ONP r | RM r
4446
+ AAX r/w | EIP r | KDC r | OPUS r | SEQ r
4447
+ ACR r | EPS r/w | KEY r | ORF r/w | SKETCH r
4448
+ AFM r | EPUB r | LA r | OTF r | SO r
4449
+ AI r/w | ERF r/w | LFP r | PAC r | SR2 r/w
4450
+ AIFF r | EXE r | LNK r | PAGES r | SRF r
4451
+ APE r | EXIF r/w/c | LRV r/w | PBM r/w | SRW r/w
4452
+ ARQ r/w | EXR r | M2TS r | PCD r | SVG r
4453
+ ARW r/w | EXV r/w/c | M4A/V r/w | PCX r | SWF r
4454
+ ASF r | F4A/V r/w | MACOS r | PDB r | THM r/w
4455
+ AVI r | FFF r/w | MAX r | PDF r/w | TIFF r/w
4456
+ AVIF r/w | FITS r | MEF r/w | PEF r/w | TORRENT r
4457
+ AZW r | FLA r | MIE r/w/c | PFA r | TTC r
4458
+ BMP r | FLAC r | MIFF r | PFB r | TTF r
4459
+ BPG r | FLIF r/w | MKA r | PFM r | TXT r
4460
+ BTF r | FLV r | MKS r | PGF r | VCF r
4461
+ CHM r | FPF r | MKV r | PGM r/w | VRD r/w/c
4462
+ COS r | FPX r | MNG r/w | PLIST r | VSD r
4463
+ CR2 r/w | GIF r/w | MOBI r | PICT r | WAV r
4464
+ CR3 r/w | GPR r/w | MODD r | PMP r | WDP r/w
4465
+ CRM r/w | GZ r | MOI r | PNG r/w | WEBP r
4466
+ CRW r/w | HDP r/w | MOS r/w | PPM r/w | WEBM r
4467
+ CS1 r/w | HDR r | MOV r/w | PPT r | WMA r
4468
+ CSV r | HEIC r/w | MP3 r | PPTX r | WMV r
4469
+ CZI r | HEIF r/w | MP4 r/w | PS r/w | WTV r
4470
+ DCM r | HTML r | MPC r | PSB r/w | WV r
4471
+ DCP r/w | ICC r/w/c | MPG r | PSD r/w | X3F r/w
4472
+ DCR r | ICS r | MPO r/w | PSP r | XCF r
4473
+ DFONT r | IDML r | MQV r/w | QTIF r/w | XLS r
4474
+ DIVX r | IIQ r/w | MRW r/w | R3D r | XLSX r
4475
+ DJVU r | IND r/w | MXF r | RA r | XMP r/w/c
4476
+ DLL r | INSP r/w | NEF r/w | RAF r/w | ZIP r
4477
+ DNG r/w | INSV r | NRW r/w | RAM r |
4478
+ DOC r | INX r | NUMBERS r | RAR r |
4479
+ DOCX r | ISO r | O r | RAW r/w |
4427
4480
 
4428
4481
  Meta Information
4429
4482
  ----------------------+----------------------+---------------------
@@ -4473,6 +4526,7 @@ L<Input-output text formatting|/Input-output text formatting>
4473
4526
  -c FMT (-coordFormat) Set format for GPS coordinates
4474
4527
  -charset [[TYPE=]CHARSET] Specify encoding for special characters
4475
4528
  -csv[[+]=CSVFILE] Export/import tags in CSV format
4529
+ -csvDelim STR Set delimiter for CSV file
4476
4530
  -d FMT (-dateFormat) Set format for date/time values
4477
4531
  -D (-decimal) Show tag ID numbers in decimal
4478
4532
  -E,-ex,-ec (-escape(HTML|XML|C))Escape tag values for HTML, XML or C
@@ -4992,8 +5046,11 @@ tag names (with optional group names) for each column of the file, and
4992
5046
  values must be separated by commas. A special "SourceFile" column specifies
4993
5047
  the files associated with each row of information (and a SourceFile of "*"
4994
5048
  may be used to define default tags to be imported for all files which are
4995
- combined with any tags specified for the specific SourceFile processed).
4996
- The following examples demonstrate basic use of this option:
5049
+ combined with any tags specified for the specific SourceFile processed). The
5050
+ B<-csvDelim> option may be used to change the input/output field delimiter
5051
+ if something other than a comma is required.
5052
+
5053
+ The following examples demonstrate basic use of the B<-csv> option:
4997
5054
 
4998
5055
  # generate CSV file with common tags from all images in a directory
4999
5056
  exiftool -common -csv dir > out.csv
@@ -5040,6 +5097,13 @@ option. When processing a large number of files, it is recommended to
5040
5097
  either use the JSON (B<-j>) or XML (B<-X>) output format, or use B<-p> to
5041
5098
  generate a fixed-column CSV file instead of using the B<-csv> option.
5042
5099
 
5100
+ =item B<-csvDelim> I<STR>
5101
+
5102
+ Set the delimiter for separating CSV entries for CSV file input/output via
5103
+ the B<-csv> option. I<STR> may contain "\t", "\n", "\r" and "\\" to
5104
+ represent TAB, LF, CR and '\' respectively. A double quote is not allowed
5105
+ in the delimiter. Default is ','.
5106
+
5043
5107
  =item B<-d> I<FMT> (B<-dateFormat>)
5044
5108
 
5045
5109
  Set the format for date/time tag values. The I<FMT> string may contain
@@ -5291,7 +5355,7 @@ with this command:
5291
5355
 
5292
5356
  produces output like this:
5293
5357
 
5294
- -- Generated by ExifTool 12.06 --
5358
+ -- Generated by ExifTool 12.12 --
5295
5359
  File: a.jpg - 2003:10:31 15:44:19
5296
5360
  (f/5.6, 1/60s, ISO 100)
5297
5361
  File: b.jpg - 2006:05:23 11:57:38
@@ -5699,7 +5763,8 @@ extracting any EXIF MakerNote information. B<-fast3> avoids extracting
5699
5763
  metadata from the file, and returns only pseudo System tags, but still reads
5700
5764
  the file header to obtain an educated guess at FileType. B<-fast4> doesn't
5701
5765
  even read the file header, and returns only System tags and a FileType based
5702
- on the file extension. Has no effect when writing.
5766
+ on the file extension. B<-fast5> also disables generation of the Composite
5767
+ tags (like B<-e>). Has no effect when writing.
5703
5768
 
5704
5769
  Note that a separate B<-fast> setting may be used for evaluation of a B<-if>
5705
5770
  condition, or when ordering files with the B<-fileOrder> option. See the
@@ -5724,7 +5789,9 @@ involves an additional processing pass of each file, but this impact may be
5724
5789
  reduced by specifying a I<NUM> for the B<-fast> level used during the
5725
5790
  metadata-extraction phase. For example, B<-fileOrder4> may be used if
5726
5791
  I<TAG> is a pseudo System tag. If multiple B<-fileOrder> options are used,
5727
- the extraction is done at the lowest B<-fast> level.
5792
+ the extraction is done at the lowest B<-fast> level. Note that files are
5793
+ sorted across directory boundaries if multiple input directories are
5794
+ specified.
5728
5795
 
5729
5796
  =item B<-i> I<DIR> (B<-ignore>)
5730
5797
 
@@ -5765,7 +5832,7 @@ Adding I<NUM> to the B<-if> option causes a separate processing pass to be
5765
5832
  executed for evaluating I<EXPR> at a B<-fast> level given by I<NUM> (see the
5766
5833
  B<-fast> option documentation for details). Without I<NUM>, only one
5767
5834
  processing pass is done at the level specified by the B<-fast> option. For
5768
- example, using B<-if4> is possible if I<EXPR> uses only pseudo System tags,
5835
+ example, using B<-if5> is possible if I<EXPR> uses only pseudo System tags,
5769
5836
  and may significantly speed processing if enough files fail the condition.
5770
5837
 
5771
5838
  The expression has access to the current ExifTool object through C<$self>,
@@ -5774,7 +5841,8 @@ of the file processing. Both functions have a return value of 1. Case is
5774
5841
  significant for function names.
5775
5842
 
5776
5843
  End() - end processing after this file
5777
- EndDir() - end processing of files in this directory
5844
+ EndDir() - end processing of files in this directory (not
5845
+ compatible with the B<-fileOrder> option)
5778
5846
 
5779
5847
  Notes:
5780
5848
 
@@ -6236,7 +6304,9 @@ about the configuration file syntax.
6236
6304
  Echo I<TEXT> to stdout (B<-echo> or B<-echo1>) or stderr (B<-echo2>). Text
6237
6305
  is output as the command line is parsed, before the processing of any input
6238
6306
  files. I<NUM> may also be 3 or 4 to output text (to stdout or stderr
6239
- respectively) after processing is complete.
6307
+ respectively) after processing is complete. For B<-echo3> and B<-echo4>,
6308
+ "${status}" may be used in the I<TEXT> string to represent the numerical
6309
+ exit status of the command (see L</EXIT STATUS>).
6240
6310
 
6241
6311
  =item B<-efile>[I<NUM>][!] I<ERRFILE>
6242
6312
 
@@ -6257,7 +6327,8 @@ commands were executed as separate command lines (with the exception of the
6257
6327
  B<-config> and B<-use> options which remain in effect for subsequent
6258
6328
  commands). Allows multiple commands to be executed from a single command
6259
6329
  line. I<NUM> is an optional number that is echoed in the "{ready}" message
6260
- when using the B<-stay_open> feature.
6330
+ when using the B<-stay_open> feature. If a I<NUM> is specified, the B<-q>
6331
+ option no longer suppresses the output "{readyNUM}" message.
6261
6332
 
6262
6333
  =item B<-srcfile> I<FMT>
6263
6334
 
@@ -6307,7 +6378,10 @@ received up to this point, send a "{ready}" message to stdout when done
6307
6378
  (unless the B<-q> or B<-T> option is used), and continue trying to read
6308
6379
  arguments for the next command from I<ARGFILE>. To aid in command/response
6309
6380
  synchronization, any number appended to the C<-execute> option is echoed in
6310
- the "{ready}" message. For example, C<-execute613> results in "{ready613}".
6381
+ the "{ready}" message. For example, C<-execute613> results in "{ready613}".
6382
+ When this number is added, B<-q> no longer suppresses the "{ready}" message.
6383
+ (Also, see the B<-echo3> and B<-echo4> options for additional ways to pass
6384
+ signals back to your application.)
6311
6385
 
6312
6386
  4) Repeat steps 2 and 3 for each command.
6313
6387
 
@@ -6322,7 +6396,7 @@ writing the following lines to the currently open I<ARGFILE>:
6322
6396
  -@
6323
6397
  NEWARGFILE
6324
6398
 
6325
- This causes I<ARGFILE> to be closed, and I<NEWARGFILE> to be kept open.
6399
+ This causes I<ARGFILE> to be closed, and I<NEWARGFILE> to be kept open.
6326
6400
  (Without the B<-stay_open> here, exiftool would have returned to reading
6327
6401
  arguments from I<ARGFILE> after reaching the end of I<NEWARGFILE>.)
6328
6402