exiftool_vendored 12.08.0 → 12.13.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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +85 -2
  3. data/bin/MANIFEST +2 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +43 -43
  7. data/bin/exiftool +176 -96
  8. data/bin/lib/Image/ExifTool.pm +15 -9
  9. data/bin/lib/Image/ExifTool.pod +62 -52
  10. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +14 -4
  11. data/bin/lib/Image/ExifTool/Canon.pm +181 -15
  12. data/bin/lib/Image/ExifTool/DarwinCore.pm +7 -5
  13. data/bin/lib/Image/ExifTool/GIF.pm +2 -2
  14. data/bin/lib/Image/ExifTool/Geotag.pm +29 -10
  15. data/bin/lib/Image/ExifTool/GoPro.pm +1 -9
  16. data/bin/lib/Image/ExifTool/Import.pm +14 -11
  17. data/bin/lib/Image/ExifTool/JSON.pm +27 -4
  18. data/bin/lib/Image/ExifTool/MPF.pm +2 -2
  19. data/bin/lib/Image/ExifTool/MacOS.pm +3 -1
  20. data/bin/lib/Image/ExifTool/Matroska.pm +3 -1
  21. data/bin/lib/Image/ExifTool/Minolta.pm +2 -1
  22. data/bin/lib/Image/ExifTool/Nikon.pm +7 -4
  23. data/bin/lib/Image/ExifTool/Olympus.pm +3 -1
  24. data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -0
  25. data/bin/lib/Image/ExifTool/Pentax.pm +10 -3
  26. data/bin/lib/Image/ExifTool/QuickTime.pm +52 -22
  27. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +50 -37
  28. data/bin/lib/Image/ExifTool/README +5 -2
  29. data/bin/lib/Image/ExifTool/Radiance.pm +7 -2
  30. data/bin/lib/Image/ExifTool/Sony.pm +16 -17
  31. data/bin/lib/Image/ExifTool/Stim.pm +2 -2
  32. data/bin/lib/Image/ExifTool/TagLookup.pm +5756 -5710
  33. data/bin/lib/Image/ExifTool/TagNames.pod +210 -19
  34. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +7 -6
  35. data/bin/lib/Image/ExifTool/Writer.pl +20 -14
  36. data/bin/lib/Image/ExifTool/XMP.pm +62 -17
  37. data/bin/lib/Image/ExifTool/XMP2.pl +5 -0
  38. data/bin/perl-Image-ExifTool.spec +42 -42
  39. data/lib/exiftool_vendored/version.rb +1 -1
  40. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: de420a08613ea979229474f4e30c7fb955722a925df577be54f7ecd1d699a0cc
4
- data.tar.gz: cf0aceff1910dfbfbdf48f45fb128d288c98600eda74278552e7b8c46929c112
3
+ metadata.gz: db3a7aa5240badd765f9044226898f1fdd5d89286ae3229cc33e303a07a66650
4
+ data.tar.gz: ed260754d2395c78de549a723c77f3231859f235d61cdd9d0c9defb5d26a537f
5
5
  SHA512:
6
- metadata.gz: fac07325ff3360e702016c0e2c131f9a388c471ee3d04850516c6afb100416a93da6caaf35388e1cfc3d6763a357492294defeb7aff2b11ee5d00d6c8a980a31
7
- data.tar.gz: 85f7e37ceeb7571857c83de445151f67c54e55fb2293c68ea3e02b556555f8b982825b9bce2ed8ec5c0e8a4acc09318a562af7dbeed115b180fe610089d86d86
6
+ metadata.gz: d582b2f2893382ee400e160a908c685fd7b8b3e88a8dc06548bb9092b49695ca8ae109e8eae68805d710933705f1cad8ead1e159e2d0b5051d93b95677ba4a2c
7
+ data.tar.gz: e5225a46e4d1805467cec7bb4e23ff9e2215dffcf6f1964067455de022739b406d21ff7df9faf32ed37ebd257d2a46842519e6f096c5d0f8d86dd39b236c56f2
@@ -5,7 +5,89 @@ ExifTool Version History
5
5
  RSS feed: https://exiftool.org/rss.xml
6
6
 
7
7
  Note: The most recent production release is Version 12.00. (Other versions are
8
- considered development releases, and are not uploaded to CPAN.)
8
+ considered development releases, and are not uploaded to MetaCPAN.)
9
+
10
+ Dec. 24, 2020 - Version 12.13
11
+
12
+ - Add time zone automatically to most string-based QuickTime date/time tags
13
+ when writing unless the PrintConv option is disabled
14
+ - Added -i HIDDEN option to ignore files with names that start with "."
15
+ - Added a few new Nikon ShutterMode values (thanks Jan Skoda)
16
+ - Added ability to write Google GCamera MicroVideo XMP tags
17
+ - Decode a new Sony tag (thanks LibRaw)
18
+ - Changed behaviour when writing only pseudo tags to return an error and avoid
19
+ writing any other tags if writing FileName fails
20
+ - Print "X image files read" message even if only 1 file is read when at least
21
+ one other file has failed the -if condition
22
+
23
+ Dec. 4, 2020 - Version 12.12
24
+
25
+ - Added ability to geotag from DJI CSV log files
26
+ - Added a new CanonModelID
27
+ - Added a couple of new Sony LensType values (thanks LibRaw)
28
+ - Enhanced -csvDelim option to allow "\t", "\n", "\r" and "\\"
29
+ - Unescape "\b" and "\f" in imported JSON values
30
+ - Fixed bug introduced in 12.10 which generated a "Not an integer" warning
31
+ when attempting to shift some QuickTime date/time tags
32
+ - Fixed shared-write permission problem with -@ argfile when using -stay_open
33
+ and a filename containing special characters on Windows
34
+
35
+ Nov. 27, 2020 - Version 12.11
36
+
37
+ - Added -csvDelim option
38
+ - Added new Canon and Olympus LensType values (thanks LibRaw)
39
+ - Added a warning if ICC_Profile is deleted from an image (github issue #63)
40
+ - EndDir() function for -if option now works when -fileOrder is used
41
+ - Changed FileSize conversion to use binary prefixes since that is how the
42
+ conversion is currently done (eg. MiB instead of MB)
43
+ - Patched -csv option so columns aren't resorted when using -G option and one
44
+ of the tags is missing from a file
45
+ - Fixed incompatiblity with Google Photos when writing UserData:GPSCoordinates
46
+ to MP4 videos
47
+ - Fixed problem where the tags available in a -p format string were limited to
48
+ the same as the -if[NUM] option when NUM was specified
49
+ - Fixed incorrect decoding of SourceFileIndex/SourceDirectoryIndex for Ricoh
50
+ models
51
+
52
+ Nov. 12, 2020 - Version 12.10
53
+
54
+ - Added -validate test for proper TIFF magic number in JPEG EXIF header
55
+ - Added support for Nikon Z7 LensData version 0801
56
+ - Added a new XMP-GPano tag
57
+ - Decode ColorData for the Canon EOS 1DXmkIII (thanks LibRaw)
58
+ - Decode more tags for the Sony ILCE-7SM3 (thanks Jos Roost)
59
+ - Automatically apply QuickTimeUTC option for CR3 files
60
+ - Improved decoding of XAttrMDLabel from MacOS files
61
+ - Ignore time zones when writing date/time values and using the -d option
62
+ - Enhanced -echo3 and -echo4 options to allow exit status to be returned
63
+ - Changed -execute so the -q option no longer suppresses the "{ready}" message
64
+ when a synchronization number is used (eg. -execute123)
65
+
66
+ Oct. 29, 2020 - Version 12.09
67
+
68
+ - Added ability to copy CanonMakerNotes from CR3 images to other file types
69
+ - Added read support for ON1 presets file (.ONP)
70
+ - Added two new CanonModelID values
71
+ - Added trailing "/" when writing QuickTime:GPSCoordinates
72
+ - Added a number of new XMP-crs tags
73
+ - Added a new Sony LensType (thanks Jos Roost)
74
+ - Added a new Nikon Z lens (thanks LibRaw)
75
+ - Added a new Canon LensType
76
+ - Decode ColorData for Canon EOS R5/R6
77
+ - Decode a couple of new HEIF tags
78
+ - Decode FirmwareVersion for Canon M50
79
+ - Improved decoding of Sony CreativeStyle tags (thanks Jos Roost)
80
+ - Improved parsing of Radiance files to recognize comments
81
+ - Renamed GIF AspectRatio tag to PixelAspectRatio
82
+ - Patched EndDir() feature so subdirectories are always processed when -r is
83
+ used (previously, EndDir() would end processing of a directory completely)
84
+ - Yet another tweak to the EventTime formatting rules (also allow time-only
85
+ values with fractional seconds and a time zone)
86
+ - Avoid loading GoPro module unnecessarily when reading MP4 videos from some
87
+ other cameras
88
+ - Fixed problem with an incorrect naming of CodecID tags in some MKV videos
89
+ - Fixed verbose output to avoid "adding" messages for existing flattened XMP
90
+ tags
9
91
 
10
92
  Oct. 15, 2020 - Version 12.08
11
93
 
@@ -16,6 +98,7 @@ Oct. 15, 2020 - Version 12.08
16
98
  - Improved decoding of a number of Sony tags (thanks Jos Roost)
17
99
  - Fixed problem where the special -if EndDir() function didn't work properly
18
100
  for directories after the one in which it was initially called
101
+ - Patched to read DLL files which don't have a .rsrc section (thanks Hank)
19
102
  - Patched to support new IGC date format when geotagging
20
103
  - Patched to read DLL files with an invalid size in the header
21
104
 
@@ -24,7 +107,7 @@ Oct. 2, 2020 - Version 12.07
24
107
  - Added support for GoPro .360 videos
25
108
  - Added some new Canon RF and Nikkor Z lenses (thanks LibRaw)
26
109
  - Added some new Sony LensType and CreativeStyle values and decode some
27
- ICLE-7C tags (thanks Jos Roost)
110
+ ILCE-7C tags (thanks Jos Roost)
28
111
  - Added a number of new Olympus SceneMode values (thanks Herb)
29
112
  - Added a new Nikon LensID
30
113
  - Decode more timed metadata from Insta360 videos (thanks Thomas Allen)
@@ -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
@@ -986,6 +987,7 @@ t/images/Geotag.log
986
987
  t/images/Geotag.xml
987
988
  t/images/Geotag2.log
988
989
  t/images/Geotag3.log
990
+ t/images/Geotag_DJI_2020-12-02_[07-50-31].csv
989
991
  t/images/GoPro.jpg
990
992
  t/images/HTML.html
991
993
  t/images/ICC_Profile.icc
@@ -47,5 +47,5 @@
47
47
  }
48
48
  },
49
49
  "release_status" : "stable",
50
- "version" : "12.08"
50
+ "version" : "12.13"
51
51
  }
@@ -28,4 +28,4 @@ recommends:
28
28
  Time::HiRes: 0
29
29
  requires:
30
30
  perl: 5.004
31
- version: 12.08
31
+ version: 12.13
data/bin/README CHANGED
@@ -14,47 +14,47 @@ supported by ExifTool (r = read, w = write, c = create):
14
14
 
15
15
  File Types
16
16
  ------------+-------------+-------------+-------------+------------
17
- 360 r/w | DPX r | ITC r | ODP r | RSRC r
18
- 3FR r | DR4 r/w/c | J2C r | ODS r | RTF r
19
- 3G2 r/w | DSS r | JNG r/w | ODT r | RW2 r/w
20
- 3GP r/w | DV r | JP2 r/w | OFR r | RWL r/w
21
- A r | DVB r/w | JPEG r/w | OGG r | RWZ r
22
- AA r | DVR-MS r | JSON r | OGV r | RM r
23
- AAE r | DYLIB r | K25 r | OPUS r | SEQ r
24
- AAX r/w | EIP r | KDC r | ORF r/w | SKETCH r
25
- ACR r | EPS r/w | KEY r | OTF r | SO r
26
- AFM r | EPUB r | LA r | PAC r | SR2 r/w
27
- AI r/w | ERF r/w | LFP r | PAGES r | SRF r
28
- AIFF r | EXE r | LNK r | PBM r/w | SRW r/w
29
- APE r | EXIF r/w/c | LRV r/w | PCD r | SVG r
30
- ARQ r/w | EXR r | M2TS r | PCX r | SWF r
31
- ARW r/w | EXV r/w/c | M4A/V r/w | PDB r | THM r/w
32
- ASF r | F4A/V r/w | MACOS r | PDF r/w | TIFF r/w
33
- AVI r | FFF r/w | MAX r | PEF r/w | TORRENT r
34
- AVIF r/w | FITS r | MEF r/w | PFA r | TTC r
35
- AZW r | FLA r | MIE r/w/c | PFB r | TTF r
36
- BMP r | FLAC r | MIFF r | PFM r | TXT r
37
- BPG r | FLIF r/w | MKA r | PGF r | VCF r
38
- BTF r | FLV r | MKS r | PGM r/w | VRD r/w/c
39
- CHM r | FPF r | MKV r | PLIST r | VSD r
40
- COS r | FPX r | MNG r/w | PICT r | WAV r
41
- CR2 r/w | GIF r/w | MOBI r | PMP r | WDP r/w
42
- CR3 r/w | GPR r/w | MODD r | PNG r/w | WEBP r
43
- CRM r/w | GZ r | MOI r | PPM r/w | WEBM r
44
- CRW r/w | HDP r/w | MOS r/w | PPT r | WMA r
45
- CS1 r/w | HDR r | MOV r/w | PPTX r | WMV r
46
- CSV r | HEIC r/w | MP3 r | PS r/w | WTV r
47
- CZI r | HEIF r/w | MP4 r/w | PSB r/w | WV r
48
- DCM r | HTML r | MPC r | PSD r/w | X3F r/w
49
- DCP r/w | ICC r/w/c | MPG r | PSP r | XCF r
50
- DCR r | ICS r | MPO r/w | QTIF r/w | XLS r
51
- DFONT r | IDML r | MQV r/w | R3D r | XLSX r
52
- DIVX r | IIQ r/w | MRW r/w | RA r | XMP r/w/c
53
- DJVU r | IND r/w | MXF r | RAF r/w | ZIP r
54
- DLL r | INSP r/w | NEF r/w | RAM r |
55
- DNG r/w | INSV r | NRW r/w | RAR r |
56
- DOC r | INX r | NUMBERS r | RAW r/w |
57
- DOCX r | ISO r | O r | RIFF 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 |
58
58
 
59
59
  Meta Information
60
60
  ----------------------+----------------------+---------------------
@@ -106,8 +106,8 @@ your home directory, then you would type the following commands in a
106
106
  terminal window to extract and run ExifTool:
107
107
 
108
108
  cd ~/Desktop
109
- gzip -dc Image-ExifTool-12.08.tar.gz | tar -xf -
110
- cd Image-ExifTool-12.08
109
+ gzip -dc Image-ExifTool-12.13.tar.gz | tar -xf -
110
+ cd Image-ExifTool-12.13
111
111
  ./exiftool t/images/ExifTool.jpg
112
112
 
113
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.08';
13
+ my $version = '12.13';
14
14
 
15
15
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
16
16
  my $exeDir;
@@ -106,6 +106,7 @@ my %csvTags; # lookup for all found tags with CSV option (lower case keys
106
106
  my %database; # lookup for database information based on file name (in ExifTool Charset)
107
107
  my %filterExt; # lookup for filtered extensions
108
108
  my %ignore; # directory names to ignore
109
+ my $ignoreHidden; # flag to ignore hidden files
109
110
  my %preserveTime; # preserved timestamps for files
110
111
  my %printFmt; # the contents of the print format file
111
112
  my %setTags; # hash of list references for tags to set from files
@@ -136,12 +137,13 @@ my $countSameWr; # count files written OK but not changed
136
137
  my $critical; # flag for critical operations (disable CTRL-C)
137
138
  my $csv; # flag for CSV option (set to "CSV", or maybe "JSON" when writing)
138
139
  my $csvAdd; # flag to add CSV information to existing lists
140
+ my $csvDelim; # delimiter for CSV files
139
141
  my $csvSaveCount; # save counter for last CSV file loaded
140
142
  my $deleteOrig; # 0=restore original files, 1=delete originals, 2=delete w/o asking
141
143
  my $disableOutput; # flag to disable normal output
142
144
  my $doSetFileName; # flag set if FileName may be written
143
145
  my $doUnzip; # flag to extract info from .gz and .bz2 files
144
- my ($end,$endDir); # flags to end processing
146
+ my ($end,$endDir,%endDir); # flags to end processing
145
147
  my $escapeC; # C-style escape
146
148
  my $escapeHTML; # flag to escape printed values for html
147
149
  my $evalWarning; # warning from eval
@@ -239,6 +241,7 @@ my %optArgs = (
239
241
  '-c' => 1, '-coordformat' => 1,
240
242
  '-charset' => 0, # (optional arg; OK because arg cannot begin with "-")
241
243
  '-config' => 1,
244
+ '-csvdelim' => 1,
242
245
  '-d' => 1, '-dateformat' => 1,
243
246
  '-D' => 0, # necessary to avoid matching lower-case equivalent
244
247
  '-echo' => 1, '-echo1' => 1, '-echo2' => 1, '-echo3' => 1, '-echo4' => 1,
@@ -246,11 +249,12 @@ my %optArgs = (
246
249
  '-efile!' => 1, '-efile1!' => 1, '-efile2!' => 1, '-efile3!' => 1, '-efile4!' => 1,
247
250
  '-ext' => 1, '--ext' => 1, '-ext+' => 1, '--ext+' => 1,
248
251
  '-extension' => 1, '--extension' => 1, '-extension+' => 1, '--extension+' => 1,
249
- '-fileorder' => 1,
252
+ '-fileorder' => 1, '-fileorder0' => 1, '-fileorder1' => 1, '-fileorder2' => 1,
253
+ '-fileorder3' => 1, '-fileorder4' => 1, '-fileorder5' => 1,
250
254
  '-geotag' => 1,
251
255
  '-globaltimeshift' => 1,
252
256
  '-i' => 1, '-ignore' => 1,
253
- '-if' => 1, '-if0' => 1, '-if1' => 1, '-if2' => 1, '-if3' => 1, '-if4' => 1,
257
+ '-if' => 1, '-if0' => 1, '-if1' => 1, '-if2' => 1, '-if3' => 1, '-if4' => 1, '-if5' => 1,
254
258
  '-lang' => 0, # (optional arg; cannot begin with "-")
255
259
  '-listitem' => 1,
256
260
  '-o' => 1, '-out' => 1,
@@ -366,13 +370,21 @@ if (grep /^-common_args$/i, @ARGV) {
366
370
  # loop over sets of command-line arguments separated by "-execute"
367
371
  Command: for (;;) {
368
372
 
369
- @echo3 and print STDOUT join("\n", @echo3), "\n";
370
- @echo4 and print STDERR join("\n", @echo4), "\n";
373
+ if (@echo3) {
374
+ my $str = join "\n", @echo3, "\n";
375
+ $str =~ s/\$\{status\}/$rtnVal/ig;
376
+ print STDOUT $str;
377
+ }
378
+ if (@echo4) {
379
+ my $str = join "\n", @echo4, "\n";
380
+ $str =~ s/\$\{status\}/$rtnVal/ig;
381
+ print STDERR $str;
382
+ }
371
383
 
372
384
  $rafStdin->Close() if $rafStdin;
373
385
  undef $rafStdin;
374
386
 
375
- # save or previous return codes
387
+ # save our previous return codes
376
388
  $rtnValPrev = $rtnVal;
377
389
  $rtnValApp = $rtnVal if $rtnVal;
378
390
 
@@ -387,7 +399,7 @@ if ($binaryStdout) {
387
399
 
388
400
  # flush console and print "{ready}" message if -stay_open is in effect
389
401
  if ($stayOpen >= 2) {
390
- if ($quiet) {
402
+ if ($quiet and not defined $executeID) {
391
403
  # flush output if possible
392
404
  eval { require IO::Handle } and STDERR->flush(), STDOUT->flush();
393
405
  } else {
@@ -421,6 +433,7 @@ undef %countLink;
421
433
  undef %created;
422
434
  undef %csvTags;
423
435
  undef %database;
436
+ undef %endDir;
424
437
  undef %filterExt;
425
438
  undef %ignore;
426
439
  undef %printFmt;
@@ -456,6 +469,7 @@ undef $fileHeader;
456
469
  undef $filtered;
457
470
  undef $fixLen;
458
471
  undef $forcePrint;
472
+ undef $ignoreHidden;
459
473
  undef $joinLists;
460
474
  undef $langOpt;
461
475
  undef $listItem;
@@ -492,6 +506,7 @@ $countGoodCr = 0;
492
506
  $countGoodWr = 0;
493
507
  $countNewDir = 0;
494
508
  $countSameWr = 0;
509
+ $csvDelim = ',';
495
510
  $csvSaveCount = 0;
496
511
  $fileTrailer = '';
497
512
  $filterFlag = 0;
@@ -554,7 +569,7 @@ if (not $preserveTime and $^O eq 'MSWin32') {
554
569
  for (;;) {
555
570
 
556
571
  # 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)) {
572
+ if (not @ARGV or ($ARGV[0] =~ /^(-|\xe2\x88\x92)execute(\d+)?$/i and not $endOfOpts)) {
558
573
  if (@ARGV) {
559
574
  $executeID = $2; # save -execute number for "{ready}" response
560
575
  $helped = 1; # don't show help if we used -execute
@@ -813,7 +828,7 @@ for (;;) {
813
828
  next;
814
829
  }
815
830
  /^config$/i and Warn("Ignored -config option (not first on command line)\n"), shift, next;
816
- if (/^csv(\+?=.*)?/i) {
831
+ if (/^csv(\+?=.*)?$/i) {
817
832
  my $csvFile = $1;
818
833
  # must process on 2nd pass so -f and -charset options are available
819
834
  unless ($pass) {
@@ -833,7 +848,7 @@ for (;;) {
833
848
  if ($mt->Open(\*CSVFILE, $csvFile)) {
834
849
  binmode CSVFILE;
835
850
  require Image::ExifTool::Import;
836
- $msg = Image::ExifTool::Import::ReadCSV(\*CSVFILE, \%database, $forcePrint);
851
+ $msg = Image::ExifTool::Import::ReadCSV(\*CSVFILE, \%database, $forcePrint, $csvDelim);
837
852
  close(CSVFILE);
838
853
  } else {
839
854
  $msg = "Error opening CSV file '${csvFile}'";
@@ -844,6 +859,15 @@ for (;;) {
844
859
  $csv = 'CSV';
845
860
  next;
846
861
  }
862
+ if (/^csvdelim$/i) {
863
+ $csvDelim = shift;
864
+ defined $csvDelim or Error("Expecting argument for -csvDelim option\n"), $badCmd=1, next;
865
+ $csvDelim =~ /"/ and Error("CSV delimiter can not contain a double quote\n"), $badCmd=1, next;
866
+ my %unescape = ( 't'=>"\t", 'n'=>"\n", 'r'=>"\r", '\\' => '\\' );
867
+ $csvDelim =~ s/\\(.)/$unescape{$1}||"\\$1"/sge;
868
+ $mt->Options(CSVDelim => $csvDelim);
869
+ next;
870
+ }
847
871
  if (/^d$/ or $a eq 'dateformat') {
848
872
  my $fmt = shift;
849
873
  $fmt or Error("Expecting date format for -d option\n"), $badCmd=1, next;
@@ -964,6 +988,7 @@ for (;;) {
964
988
  my $dir = shift;
965
989
  defined $dir or Error("Expecting directory name for -i option\n"), $badCmd=1, next;
966
990
  $ignore{$dir} = 1;
991
+ $dir eq 'HIDDEN' and $ignoreHidden = 1;
967
992
  next;
968
993
  }
969
994
  if (/^if(\d*)$/i) {
@@ -1841,7 +1866,7 @@ if (defined $deleteOrig) {
1841
1866
  printf($o "%5d image files %s\n", $countCopyWr, $overwriteOrig ? 'moved' : 'copied') if $countCopyWr;
1842
1867
  printf($o "%5d files weren't updated due to errors\n", $countBadWr) if $countBadWr;
1843
1868
  printf($o "%5d files weren't created due to errors\n", $countBadCr) if $countBadCr;
1844
- printf($o "%5d image files read\n", $count) if $tot>1 or ($countDir and not $totWr);
1869
+ printf($o "%5d image files read\n", $count) if ($tot+$countFailed)>1 or ($countDir and not $totWr);
1845
1870
  printf($o "%5d files could not be read\n", $countBad) if $countBad;
1846
1871
  printf($o "%5d output files created\n", scalar(keys %created)) if $textOut;
1847
1872
  printf($o "%5d output files appended\n", scalar(keys %appended)) if %appended;
@@ -1974,6 +1999,7 @@ sub GetImageInfo($$)
1974
1999
  }
1975
2000
  last unless $result;
1976
2001
  }
2002
+ undef @foundTags if $fastCondition; # ignore if we didn't get all tags
1977
2003
  }
1978
2004
  unless ($result) {
1979
2005
  $verbose and print $vout "-------- $file (failed condition)$progStr\n";
@@ -2227,7 +2253,9 @@ sub GetImageInfo($$)
2227
2253
  my $noDups = ($json or ($xml and $outFormat > 0));
2228
2254
  my $printConv = $et->Options('PrintConv');
2229
2255
  my $lastGroup = '';
2256
+ my $i = -1;
2230
2257
  TAG: foreach $tag (@foundTags) {
2258
+ ++$i; # keep track on index in @foundTags
2231
2259
  my $tagName = GetTagName($tag);
2232
2260
  my ($group, $valList);
2233
2261
  # get the value for this tag
@@ -2345,26 +2373,38 @@ TAG: foreach $tag (@foundTags) {
2345
2373
  }
2346
2374
  # save information for CSV output
2347
2375
  if ($csv) {
2348
- my $t = $group ? "$group:$tagName" : $tagName;
2349
- $t .= '#' if $tag =~ /#/; # add ValueConv "#" suffix if used
2376
+ my $tn = $tagName;
2377
+ $tn .= '#' if $tag =~ /#/; # add ValueConv "#" suffix if used
2378
+ my $gt = $group ? "$group:$tn" : $tn;
2350
2379
  # (tag-name case may be different if some tags don't exist
2351
2380
  # in a file, so all logic must use lower-case tag names)
2352
- my $lcTag = lc $t;
2381
+ my $lcTag = lc $gt;
2353
2382
  # override existing entry only if top priority
2354
2383
  next if defined $csvInfo{$lcTag} and $tag =~ /\(/;
2355
2384
  $csvInfo{$lcTag} = $val;
2356
2385
  if (defined $csvTags{$lcTag}) {
2357
2386
  # overwrite with actual extracted tag name
2358
2387
  # (note: can't check "if defined $val" here because -f may be used)
2359
- $csvTags{$lcTag} = $t if defined $$info{$tag};
2360
- } else {
2361
- # (don't save unextracted tag name unless -f was used)
2362
- $csvTags{$lcTag} = defined($val) ? $t : '';
2363
- if (@csvFiles == 1) {
2364
- push @csvTags, $lcTag; # save order of tags for first file
2365
- } elsif (@csvTags) {
2366
- undef @csvTags;
2367
- }
2388
+ $csvTags{$lcTag} = $gt if defined $$info{$tag};
2389
+ next;
2390
+ }
2391
+ # must check for "Unknown" group (for tags that don't exist)
2392
+ if ($group and defined $csvTags[$i] and $csvTags[$i] =~ /^(.*):$tn$/i) {
2393
+ next if $group eq 'Unknown'; # nothing more to do if we don't know tag group
2394
+ if ($1 eq 'unknown') {
2395
+ # replace unknown entry in CSV tag lookup and list
2396
+ delete $csvTags{$csvTags[$i]};
2397
+ $csvTags{$lcTag} = defined($val) ? $gt : '';
2398
+ $csvTags[$i] = $lcTag;
2399
+ next;
2400
+ }
2401
+ }
2402
+ # (don't save unextracted tag name unless -f was used)
2403
+ $csvTags{$lcTag} = defined($val) ? $gt : '';
2404
+ if (@csvFiles == 1) {
2405
+ push @csvTags, $lcTag; # save order of tags for first file
2406
+ } elsif (@csvTags) {
2407
+ undef @csvTags;
2368
2408
  }
2369
2409
  next;
2370
2410
  }
@@ -2896,14 +2936,19 @@ sub SetImageInfo($$$)
2896
2936
  }
2897
2937
  # quickly rename file and/or set file date if this is all we are doing
2898
2938
  if ($numSet == $numPseudo) {
2899
- my $r1 = $et->SetFileModifyDate($file,undef,'FileCreateDate');
2900
- my $r2 = $et->SetFileModifyDate($file);
2901
- my $r3 = $et->SetSystemTags($file);
2902
- my $r4 = 0;
2903
- $r4 = $et->SetFileName($file, $outfile) if defined $outfile;
2904
- if ($r1 > 0 or $r2 > 0 or $r3 > 0 or $r4 > 0) {
2939
+ my ($r0, $r1, $r2, $r3) = (0, 0, 0, 0);
2940
+ if (defined $outfile) {
2941
+ $r0 = $et->SetFileName($file, $outfile);
2942
+ $file = $$et{NewName} if $r0 > 0; # continue with new name if changed
2943
+ }
2944
+ unless ($r0 < 0) {
2945
+ $r1 = $et->SetFileModifyDate($file,undef,'FileCreateDate');
2946
+ $r2 = $et->SetFileModifyDate($file);
2947
+ $r3 = $et->SetSystemTags($file);
2948
+ }
2949
+ if ($r0 > 0 or $r1 > 0 or $r2 > 0 or $r3 > 0) {
2905
2950
  ++$countGoodWr;
2906
- } elsif ($r1 < 0 or $r2 < 0 or $r3 < 0 or $r4 < 0) {
2951
+ } elsif ($r0 < 0 or $r1 < 0 or $r2 < 0 or $r3 < 0) {
2907
2952
  EFile($infile);
2908
2953
  ++$countBadWr;
2909
2954
  return 0;
@@ -2912,8 +2957,7 @@ sub SetImageInfo($$$)
2912
2957
  ++$countSameWr;
2913
2958
  }
2914
2959
  if (defined $hardLink or defined $symLink or defined $testName) {
2915
- my $src = (defined $outfile and $r4 > 0) ? $outfile : $file;
2916
- DoHardLink($et, $src, $hardLink, $symLink, $testName);
2960
+ DoHardLink($et, $file, $hardLink, $symLink, $testName);
2917
2961
  }
2918
2962
  return 1;
2919
2963
  }
@@ -3290,7 +3334,7 @@ sub FormatCSV($)
3290
3334
  # the -b option is used to encode as Base64. It is unclear whether or not this
3291
3335
  # is valid CSV, but some readers may not like it. (If this becomes a problem,
3292
3336
  # in the future values may need to be truncated at the first NULL character.)
3293
- $val = qq{"$val"} if $val =~ s/"/""/g or $val =~ /(^\s+|\s+$)/ or $val =~ /[,\n\r]/;
3337
+ $val = qq{"$val"} if $val =~ s/"/""/g or $val =~ /(^\s+|\s+$)/ or $val =~ /[\n\r]|\Q$csvDelim/;
3294
3338
  return $val;
3295
3339
  }
3296
3340
 
@@ -3303,9 +3347,9 @@ sub PrintCSV()
3303
3347
  @csvTags or @csvTags = sort keys %csvTags;
3304
3348
  # make a list of tags actually found
3305
3349
  foreach $lcTag (@csvTags) {
3306
- push @tags, $csvTags{$lcTag} if $csvTags{$lcTag};
3350
+ push @tags, FormatCSV($csvTags{$lcTag}) if $csvTags{$lcTag};
3307
3351
  }
3308
- print join(',', 'SourceFile', @tags), "\n";
3352
+ print join($csvDelim, 'SourceFile', @tags), "\n";
3309
3353
  my $empty = defined($forcePrint) ? $forcePrint : '';
3310
3354
  foreach $file (@csvFiles) {
3311
3355
  my @vals = (FormatCSV($file)); # start with full file name
@@ -3316,7 +3360,7 @@ sub PrintCSV()
3316
3360
  defined $val or push(@vals,$empty), next;
3317
3361
  push @vals, FormatCSV($val);
3318
3362
  }
3319
- print join(',', @vals), "\n";
3363
+ print join($csvDelim, @vals), "\n";
3320
3364
  }
3321
3365
  }
3322
3366
 
@@ -3552,8 +3596,18 @@ sub ProcessFiles($;$)
3552
3596
  if ($list) {
3553
3597
  push(@$list, $file);
3554
3598
  } else {
3599
+ if (%endDir) {
3600
+ my ($d, $f) = Image::ExifTool::SplitFileName($file);
3601
+ next if $endDir{$d};
3602
+ }
3555
3603
  GetImageInfo($et, $file);
3556
3604
  $end and Warn("End called - $file\n");
3605
+ if ($endDir) {
3606
+ Warn("EndDir called - $file\n");
3607
+ my ($d, $f) = Image::ExifTool::SplitFileName($file);
3608
+ $endDir{$d} = 1;
3609
+ undef $endDir;
3610
+ }
3557
3611
  }
3558
3612
  }
3559
3613
  $et->Options(CharsetFileName => $enc) if $utf8FileName{$file};
@@ -3568,7 +3622,7 @@ sub ScanDir($$;$)
3568
3622
  {
3569
3623
  local $_;
3570
3624
  my ($et, $dir, $list) = @_;
3571
- my (@fileList, $done, $file, $utf8Name, $winSurrogate);
3625
+ my (@fileList, $done, $file, $utf8Name, $winSurrogate, $endThisDir);
3572
3626
  my $enc = $et->Options('CharsetFileName');
3573
3627
  # recode as UTF-8 if necessary
3574
3628
  if ($enc) {
@@ -3638,6 +3692,8 @@ sub ScanDir($$;$)
3638
3692
  last if $end;
3639
3693
  next;
3640
3694
  }
3695
+ next if $endThisDir;
3696
+ next if $ignoreHidden and $file =~ /^\./; # ignore hidden files if specified
3641
3697
  # apply rules from -ext options
3642
3698
  my $accepted;
3643
3699
  if ($filterFlag) {
@@ -3680,10 +3736,11 @@ sub ScanDir($$;$)
3680
3736
  last;
3681
3737
  }
3682
3738
  if ($endDir) {
3683
- $dir =~ s(/$)();
3739
+ $path =~ s(/$)();
3684
3740
  Warn("EndDir called - $path\n");
3741
+ $endDir{$path} = 1;
3742
+ $endThisDir = 1;
3685
3743
  undef $endDir;
3686
- last;
3687
3744
  }
3688
3745
  }
3689
3746
  }
@@ -4387,47 +4444,47 @@ supported by ExifTool (r = read, w = write, c = create):
4387
4444
 
4388
4445
  File Types
4389
4446
  ------------+-------------+-------------+-------------+------------
4390
- 360 r/w | DPX r | ITC r | ODP r | RSRC r
4391
- 3FR r | DR4 r/w/c | J2C r | ODS r | RTF r
4392
- 3G2 r/w | DSS r | JNG r/w | ODT r | RW2 r/w
4393
- 3GP r/w | DV r | JP2 r/w | OFR r | RWL r/w
4394
- A r | DVB r/w | JPEG r/w | OGG r | RWZ r
4395
- AA r | DVR-MS r | JSON r | OGV r | RM r
4396
- AAE r | DYLIB r | K25 r | OPUS r | SEQ r
4397
- AAX r/w | EIP r | KDC r | ORF r/w | SKETCH r
4398
- ACR r | EPS r/w | KEY r | OTF r | SO r
4399
- AFM r | EPUB r | LA r | PAC r | SR2 r/w
4400
- AI r/w | ERF r/w | LFP r | PAGES r | SRF r
4401
- AIFF r | EXE r | LNK r | PBM r/w | SRW r/w
4402
- APE r | EXIF r/w/c | LRV r/w | PCD r | SVG r
4403
- ARQ r/w | EXR r | M2TS r | PCX r | SWF r
4404
- ARW r/w | EXV r/w/c | M4A/V r/w | PDB r | THM r/w
4405
- ASF r | F4A/V r/w | MACOS r | PDF r/w | TIFF r/w
4406
- AVI r | FFF r/w | MAX r | PEF r/w | TORRENT r
4407
- AVIF r/w | FITS r | MEF r/w | PFA r | TTC r
4408
- AZW r | FLA r | MIE r/w/c | PFB r | TTF r
4409
- BMP r | FLAC r | MIFF r | PFM r | TXT r
4410
- BPG r | FLIF r/w | MKA r | PGF r | VCF r
4411
- BTF r | FLV r | MKS r | PGM r/w | VRD r/w/c
4412
- CHM r | FPF r | MKV r | PLIST r | VSD r
4413
- COS r | FPX r | MNG r/w | PICT r | WAV r
4414
- CR2 r/w | GIF r/w | MOBI r | PMP r | WDP r/w
4415
- CR3 r/w | GPR r/w | MODD r | PNG r/w | WEBP r
4416
- CRM r/w | GZ r | MOI r | PPM r/w | WEBM r
4417
- CRW r/w | HDP r/w | MOS r/w | PPT r | WMA r
4418
- CS1 r/w | HDR r | MOV r/w | PPTX r | WMV r
4419
- CSV r | HEIC r/w | MP3 r | PS r/w | WTV r
4420
- CZI r | HEIF r/w | MP4 r/w | PSB r/w | WV r
4421
- DCM r | HTML r | MPC r | PSD r/w | X3F r/w
4422
- DCP r/w | ICC r/w/c | MPG r | PSP r | XCF r
4423
- DCR r | ICS r | MPO r/w | QTIF r/w | XLS r
4424
- DFONT r | IDML r | MQV r/w | R3D r | XLSX r
4425
- DIVX r | IIQ r/w | MRW r/w | RA r | XMP r/w/c
4426
- DJVU r | IND r/w | MXF r | RAF r/w | ZIP r
4427
- DLL r | INSP r/w | NEF r/w | RAM r |
4428
- DNG r/w | INSV r | NRW r/w | RAR r |
4429
- DOC r | INX r | NUMBERS r | RAW r/w |
4430
- DOCX r | ISO r | O r | RIFF r |
4447
+ 360 r/w | DPX r | ITC r | ODP r | RIFF r
4448
+ 3FR r | DR4 r/w/c | J2C r | ODS r | RSRC r
4449
+ 3G2 r/w | DSS r | JNG r/w | ODT r | RTF r
4450
+ 3GP r/w | DV r | JP2 r/w | OFR r | RW2 r/w
4451
+ A r | DVB r/w | JPEG r/w | OGG r | RWL r/w
4452
+ AA r | DVR-MS r | JSON r | OGV r | RWZ r
4453
+ AAE r | DYLIB r | K25 r | ONP r | RM r
4454
+ AAX r/w | EIP r | KDC r | OPUS r | SEQ r
4455
+ ACR r | EPS r/w | KEY r | ORF r/w | SKETCH r
4456
+ AFM r | EPUB r | LA r | OTF r | SO r
4457
+ AI r/w | ERF r/w | LFP r | PAC r | SR2 r/w
4458
+ AIFF r | EXE r | LNK r | PAGES r | SRF r
4459
+ APE r | EXIF r/w/c | LRV r/w | PBM r/w | SRW r/w
4460
+ ARQ r/w | EXR r | M2TS r | PCD r | SVG r
4461
+ ARW r/w | EXV r/w/c | M4A/V r/w | PCX r | SWF r
4462
+ ASF r | F4A/V r/w | MACOS r | PDB r | THM r/w
4463
+ AVI r | FFF r/w | MAX r | PDF r/w | TIFF r/w
4464
+ AVIF r/w | FITS r | MEF r/w | PEF r/w | TORRENT r
4465
+ AZW r | FLA r | MIE r/w/c | PFA r | TTC r
4466
+ BMP r | FLAC r | MIFF r | PFB r | TTF r
4467
+ BPG r | FLIF r/w | MKA r | PFM r | TXT r
4468
+ BTF r | FLV r | MKS r | PGF r | VCF r
4469
+ CHM r | FPF r | MKV r | PGM r/w | VRD r/w/c
4470
+ COS r | FPX r | MNG r/w | PLIST r | VSD r
4471
+ CR2 r/w | GIF r/w | MOBI r | PICT r | WAV r
4472
+ CR3 r/w | GPR r/w | MODD r | PMP r | WDP r/w
4473
+ CRM r/w | GZ r | MOI r | PNG r/w | WEBP r
4474
+ CRW r/w | HDP r/w | MOS r/w | PPM r/w | WEBM r
4475
+ CS1 r/w | HDR r | MOV r/w | PPT r | WMA r
4476
+ CSV r | HEIC r/w | MP3 r | PPTX r | WMV r
4477
+ CZI r | HEIF r/w | MP4 r/w | PS r/w | WTV r
4478
+ DCM r | HTML r | MPC r | PSB r/w | WV r
4479
+ DCP r/w | ICC r/w/c | MPG r | PSD r/w | X3F r/w
4480
+ DCR r | ICS r | MPO r/w | PSP r | XCF r
4481
+ DFONT r | IDML r | MQV r/w | QTIF r/w | XLS r
4482
+ DIVX r | IIQ r/w | MRW r/w | R3D r | XLSX r
4483
+ DJVU r | IND r/w | MXF r | RA r | XMP r/w/c
4484
+ DLL r | INSP r/w | NEF r/w | RAF r/w | ZIP r
4485
+ DNG r/w | INSV r | NRW r/w | RAM r |
4486
+ DOC r | INX r | NUMBERS r | RAR r |
4487
+ DOCX r | ISO r | O r | RAW r/w |
4431
4488
 
4432
4489
  Meta Information
4433
4490
  ----------------------+----------------------+---------------------
@@ -4477,6 +4534,7 @@ L<Input-output text formatting|/Input-output text formatting>
4477
4534
  -c FMT (-coordFormat) Set format for GPS coordinates
4478
4535
  -charset [[TYPE=]CHARSET] Specify encoding for special characters
4479
4536
  -csv[[+]=CSVFILE] Export/import tags in CSV format
4537
+ -csvDelim STR Set delimiter for CSV file
4480
4538
  -d FMT (-dateFormat) Set format for date/time values
4481
4539
  -D (-decimal) Show tag ID numbers in decimal
4482
4540
  -E,-ex,-ec (-escape(HTML|XML|C))Escape tag values for HTML, XML or C
@@ -4996,8 +5054,11 @@ tag names (with optional group names) for each column of the file, and
4996
5054
  values must be separated by commas. A special "SourceFile" column specifies
4997
5055
  the files associated with each row of information (and a SourceFile of "*"
4998
5056
  may be used to define default tags to be imported for all files which are
4999
- combined with any tags specified for the specific SourceFile processed).
5000
- The following examples demonstrate basic use of this option:
5057
+ combined with any tags specified for the specific SourceFile processed). The
5058
+ B<-csvDelim> option may be used to change the input/output field delimiter
5059
+ if something other than a comma is required.
5060
+
5061
+ The following examples demonstrate basic use of the B<-csv> option:
5001
5062
 
5002
5063
  # generate CSV file with common tags from all images in a directory
5003
5064
  exiftool -common -csv dir > out.csv
@@ -5044,6 +5105,13 @@ option. When processing a large number of files, it is recommended to
5044
5105
  either use the JSON (B<-j>) or XML (B<-X>) output format, or use B<-p> to
5045
5106
  generate a fixed-column CSV file instead of using the B<-csv> option.
5046
5107
 
5108
+ =item B<-csvDelim> I<STR>
5109
+
5110
+ Set the delimiter for separating CSV entries for CSV file input/output via
5111
+ the B<-csv> option. I<STR> may contain "\t", "\n", "\r" and "\\" to
5112
+ represent TAB, LF, CR and '\' respectively. A double quote is not allowed
5113
+ in the delimiter. Default is ','.
5114
+
5047
5115
  =item B<-d> I<FMT> (B<-dateFormat>)
5048
5116
 
5049
5117
  Set the format for date/time tag values. The I<FMT> string may contain
@@ -5295,7 +5363,7 @@ with this command:
5295
5363
 
5296
5364
  produces output like this:
5297
5365
 
5298
- -- Generated by ExifTool 12.08 --
5366
+ -- Generated by ExifTool 12.13 --
5299
5367
  File: a.jpg - 2003:10:31 15:44:19
5300
5368
  (f/5.6, 1/60s, ISO 100)
5301
5369
  File: b.jpg - 2006:05:23 11:57:38
@@ -5703,7 +5771,8 @@ extracting any EXIF MakerNote information. B<-fast3> avoids extracting
5703
5771
  metadata from the file, and returns only pseudo System tags, but still reads
5704
5772
  the file header to obtain an educated guess at FileType. B<-fast4> doesn't
5705
5773
  even read the file header, and returns only System tags and a FileType based
5706
- on the file extension. Has no effect when writing.
5774
+ on the file extension. B<-fast5> also disables generation of the Composite
5775
+ tags (like B<-e>). Has no effect when writing.
5707
5776
 
5708
5777
  Note that a separate B<-fast> setting may be used for evaluation of a B<-if>
5709
5778
  condition, or when ordering files with the B<-fileOrder> option. See the
@@ -5728,7 +5797,9 @@ involves an additional processing pass of each file, but this impact may be
5728
5797
  reduced by specifying a I<NUM> for the B<-fast> level used during the
5729
5798
  metadata-extraction phase. For example, B<-fileOrder4> may be used if
5730
5799
  I<TAG> is a pseudo System tag. If multiple B<-fileOrder> options are used,
5731
- the extraction is done at the lowest B<-fast> level.
5800
+ the extraction is done at the lowest B<-fast> level. Note that files are
5801
+ sorted across directory boundaries if multiple input directories are
5802
+ specified.
5732
5803
 
5733
5804
  =item B<-i> I<DIR> (B<-ignore>)
5734
5805
 
@@ -5737,7 +5808,9 @@ name, or a full path. If a full path is specified, it must match the
5737
5808
  Directory tag exactly to be ignored. Use multiple B<-i> options to ignore
5738
5809
  more than one directory name. A special I<DIR> value of C<SYMLINKS> (case
5739
5810
  sensitive) may be specified to ignore symbolic links when the B<-r> option
5740
- is used.
5811
+ is used. As well, a value of C<HIDDEN> (case sensitive) may be used to
5812
+ ignore files with names that start with a "." (ie. hidden files on Unix
5813
+ systems) when scanning a directory.
5741
5814
 
5742
5815
  =item B<-if>[I<NUM>] I<EXPR>
5743
5816
 
@@ -5769,7 +5842,7 @@ Adding I<NUM> to the B<-if> option causes a separate processing pass to be
5769
5842
  executed for evaluating I<EXPR> at a B<-fast> level given by I<NUM> (see the
5770
5843
  B<-fast> option documentation for details). Without I<NUM>, only one
5771
5844
  processing pass is done at the level specified by the B<-fast> option. For
5772
- example, using B<-if4> is possible if I<EXPR> uses only pseudo System tags,
5845
+ example, using B<-if5> is possible if I<EXPR> uses only pseudo System tags,
5773
5846
  and may significantly speed processing if enough files fail the condition.
5774
5847
 
5775
5848
  The expression has access to the current ExifTool object through C<$self>,
@@ -5778,7 +5851,8 @@ of the file processing. Both functions have a return value of 1. Case is
5778
5851
  significant for function names.
5779
5852
 
5780
5853
  End() - end processing after this file
5781
- EndDir() - end processing of files in this directory
5854
+ EndDir() - end processing of files in this directory (not
5855
+ compatible with the B<-fileOrder> option)
5782
5856
 
5783
5857
  Notes:
5784
5858
 
@@ -6240,7 +6314,9 @@ about the configuration file syntax.
6240
6314
  Echo I<TEXT> to stdout (B<-echo> or B<-echo1>) or stderr (B<-echo2>). Text
6241
6315
  is output as the command line is parsed, before the processing of any input
6242
6316
  files. I<NUM> may also be 3 or 4 to output text (to stdout or stderr
6243
- respectively) after processing is complete.
6317
+ respectively) after processing is complete. For B<-echo3> and B<-echo4>,
6318
+ "${status}" may be used in the I<TEXT> string to represent the numerical
6319
+ exit status of the command (see L</EXIT STATUS>).
6244
6320
 
6245
6321
  =item B<-efile>[I<NUM>][!] I<ERRFILE>
6246
6322
 
@@ -6261,7 +6337,8 @@ commands were executed as separate command lines (with the exception of the
6261
6337
  B<-config> and B<-use> options which remain in effect for subsequent
6262
6338
  commands). Allows multiple commands to be executed from a single command
6263
6339
  line. I<NUM> is an optional number that is echoed in the "{ready}" message
6264
- when using the B<-stay_open> feature.
6340
+ when using the B<-stay_open> feature. If a I<NUM> is specified, the B<-q>
6341
+ option no longer suppresses the output "{readyNUM}" message.
6265
6342
 
6266
6343
  =item B<-srcfile> I<FMT>
6267
6344
 
@@ -6311,7 +6388,10 @@ received up to this point, send a "{ready}" message to stdout when done
6311
6388
  (unless the B<-q> or B<-T> option is used), and continue trying to read
6312
6389
  arguments for the next command from I<ARGFILE>. To aid in command/response
6313
6390
  synchronization, any number appended to the C<-execute> option is echoed in
6314
- the "{ready}" message. For example, C<-execute613> results in "{ready613}".
6391
+ the "{ready}" message. For example, C<-execute613> results in "{ready613}".
6392
+ When this number is added, B<-q> no longer suppresses the "{ready}" message.
6393
+ (Also, see the B<-echo3> and B<-echo4> options for additional ways to pass
6394
+ signals back to your application.)
6315
6395
 
6316
6396
  4) Repeat steps 2 and 3 for each command.
6317
6397
 
@@ -6326,7 +6406,7 @@ writing the following lines to the currently open I<ARGFILE>:
6326
6406
  -@
6327
6407
  NEWARGFILE
6328
6408
 
6329
- This causes I<ARGFILE> to be closed, and I<NEWARGFILE> to be kept open.
6409
+ This causes I<ARGFILE> to be closed, and I<NEWARGFILE> to be kept open.
6330
6410
  (Without the B<-stay_open> here, exiftool would have returned to reading
6331
6411
  arguments from I<ARGFILE> after reaching the end of I<NEWARGFILE>.)
6332
6412
 
@@ -6417,9 +6497,9 @@ For example, the following command may be used to remove duplicate Keywords:
6417
6497
  The B<-sep> option is necessary to split the string back into individual
6418
6498
  list items when writing to a list-type tag.
6419
6499
 
6420
- An optional flag argument may be set to 1 to cause C<NoDups> to return undef
6421
- if no duplicates existed, thus preventing the file from being rewritten
6422
- unnecessarily:
6500
+ An optional flag argument may be set to 1 to cause C<NoDups> to set C<$_> to
6501
+ undef if no duplicates existed, thus preventing the file from being
6502
+ rewritten unnecessarily:
6423
6503
 
6424
6504
  exiftool -sep '##' '-keywords<${keywords;NoDups(1)}' a.jpg
6425
6505