exiftool_vendored 12.08.0 → 12.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of exiftool_vendored might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/bin/Changes +85 -2
- data/bin/MANIFEST +2 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +43 -43
- data/bin/exiftool +176 -96
- data/bin/lib/Image/ExifTool.pm +15 -9
- data/bin/lib/Image/ExifTool.pod +62 -52
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +14 -4
- data/bin/lib/Image/ExifTool/Canon.pm +181 -15
- data/bin/lib/Image/ExifTool/DarwinCore.pm +7 -5
- data/bin/lib/Image/ExifTool/GIF.pm +2 -2
- data/bin/lib/Image/ExifTool/Geotag.pm +29 -10
- data/bin/lib/Image/ExifTool/GoPro.pm +1 -9
- data/bin/lib/Image/ExifTool/Import.pm +14 -11
- data/bin/lib/Image/ExifTool/JSON.pm +27 -4
- data/bin/lib/Image/ExifTool/MPF.pm +2 -2
- data/bin/lib/Image/ExifTool/MacOS.pm +3 -1
- data/bin/lib/Image/ExifTool/Matroska.pm +3 -1
- data/bin/lib/Image/ExifTool/Minolta.pm +2 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +7 -4
- data/bin/lib/Image/ExifTool/Olympus.pm +3 -1
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -0
- data/bin/lib/Image/ExifTool/Pentax.pm +10 -3
- data/bin/lib/Image/ExifTool/QuickTime.pm +52 -22
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +50 -37
- data/bin/lib/Image/ExifTool/README +5 -2
- data/bin/lib/Image/ExifTool/Radiance.pm +7 -2
- data/bin/lib/Image/ExifTool/Sony.pm +16 -17
- data/bin/lib/Image/ExifTool/Stim.pm +2 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +5756 -5710
- data/bin/lib/Image/ExifTool/TagNames.pod +210 -19
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +7 -6
- data/bin/lib/Image/ExifTool/Writer.pl +20 -14
- data/bin/lib/Image/ExifTool/XMP.pm +62 -17
- data/bin/lib/Image/ExifTool/XMP2.pl +5 -0
- data/bin/perl-Image-ExifTool.spec +42 -42
- data/lib/exiftool_vendored/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db3a7aa5240badd765f9044226898f1fdd5d89286ae3229cc33e303a07a66650
|
4
|
+
data.tar.gz: ed260754d2395c78de549a723c77f3231859f235d61cdd9d0c9defb5d26a537f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d582b2f2893382ee400e160a908c685fd7b8b3e88a8dc06548bb9092b49695ca8ae109e8eae68805d710933705f1cad8ead1e159e2d0b5051d93b95677ba4a2c
|
7
|
+
data.tar.gz: e5225a46e4d1805467cec7bb4e23ff9e2215dffcf6f1964067455de022739b406d21ff7df9faf32ed37ebd257d2a46842519e6f096c5d0f8d86dd39b236c56f2
|
data/bin/Changes
CHANGED
@@ -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
|
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
|
-
|
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)
|
data/bin/MANIFEST
CHANGED
@@ -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
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
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 |
|
18
|
-
3FR r | DR4 r/w/c | J2C r | ODS r |
|
19
|
-
3G2 r/w | DSS r | JNG r/w | ODT r |
|
20
|
-
3GP r/w | DV r | JP2 r/w | OFR r |
|
21
|
-
A r | DVB r/w | JPEG r/w | OGG r |
|
22
|
-
AA r | DVR-MS r | JSON r | OGV r |
|
23
|
-
AAE r | DYLIB r | K25 r |
|
24
|
-
AAX r/w | EIP r | KDC r |
|
25
|
-
ACR r | EPS r/w | KEY r |
|
26
|
-
AFM r | EPUB r | LA r |
|
27
|
-
AI r/w | ERF r/w | LFP r |
|
28
|
-
AIFF r | EXE r | LNK r |
|
29
|
-
APE r | EXIF r/w/c | LRV r/w |
|
30
|
-
ARQ r/w | EXR r | M2TS r |
|
31
|
-
ARW r/w | EXV r/w/c | M4A/V r/w |
|
32
|
-
ASF r | F4A/V r/w | MACOS r |
|
33
|
-
AVI r | FFF r/w | MAX r |
|
34
|
-
AVIF r/w | FITS r | MEF r/w |
|
35
|
-
AZW r | FLA r | MIE r/w/c |
|
36
|
-
BMP r | FLAC r | MIFF r |
|
37
|
-
BPG r | FLIF r/w | MKA r |
|
38
|
-
BTF r | FLV r | MKS r |
|
39
|
-
CHM r | FPF r | MKV r |
|
40
|
-
COS r | FPX r | MNG r/w |
|
41
|
-
CR2 r/w | GIF r/w | MOBI r |
|
42
|
-
CR3 r/w | GPR r/w | MODD r |
|
43
|
-
CRM r/w | GZ r | MOI r |
|
44
|
-
CRW r/w | HDP r/w | MOS r/w |
|
45
|
-
CS1 r/w | HDR r | MOV r/w |
|
46
|
-
CSV r | HEIC r/w | MP3 r |
|
47
|
-
CZI r | HEIF r/w | MP4 r/w |
|
48
|
-
DCM r | HTML r | MPC r |
|
49
|
-
DCP r/w | ICC r/w/c | MPG r |
|
50
|
-
DCR r | ICS r | MPO r/w |
|
51
|
-
DFONT r | IDML r | MQV r/w |
|
52
|
-
DIVX r | IIQ r/w | MRW r/w |
|
53
|
-
DJVU r | IND r/w | MXF r |
|
54
|
-
DLL r | INSP r/w | NEF r/w |
|
55
|
-
DNG r/w | INSV r | NRW r/w |
|
56
|
-
DOC r | INX r | NUMBERS r |
|
57
|
-
DOCX r | ISO r | O 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.
|
110
|
-
cd Image-ExifTool-12.
|
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.
|
data/bin/exiftool
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
use strict;
|
11
11
|
require 5.004;
|
12
12
|
|
13
|
-
my $version = '12.
|
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
|
-
|
370
|
-
|
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
|
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
|
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(\+?=.*)
|
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 $
|
2349
|
-
$
|
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 $
|
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} = $
|
2360
|
-
|
2361
|
-
|
2362
|
-
|
2363
|
-
|
2364
|
-
|
2365
|
-
|
2366
|
-
|
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 =
|
2900
|
-
|
2901
|
-
|
2902
|
-
|
2903
|
-
|
2904
|
-
|
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 ($
|
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
|
-
|
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 =~ /[
|
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(
|
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(
|
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
|
-
$
|
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 |
|
4391
|
-
3FR r | DR4 r/w/c | J2C r | ODS r |
|
4392
|
-
3G2 r/w | DSS r | JNG r/w | ODT r |
|
4393
|
-
3GP r/w | DV r | JP2 r/w | OFR r |
|
4394
|
-
A r | DVB r/w | JPEG r/w | OGG r |
|
4395
|
-
AA r | DVR-MS r | JSON r | OGV r |
|
4396
|
-
AAE r | DYLIB r | K25 r |
|
4397
|
-
AAX r/w | EIP r | KDC r |
|
4398
|
-
ACR r | EPS r/w | KEY r |
|
4399
|
-
AFM r | EPUB r | LA r |
|
4400
|
-
AI r/w | ERF r/w | LFP r |
|
4401
|
-
AIFF r | EXE r | LNK r |
|
4402
|
-
APE r | EXIF r/w/c | LRV r/w |
|
4403
|
-
ARQ r/w | EXR r | M2TS r |
|
4404
|
-
ARW r/w | EXV r/w/c | M4A/V r/w |
|
4405
|
-
ASF r | F4A/V r/w | MACOS r |
|
4406
|
-
AVI r | FFF r/w | MAX r |
|
4407
|
-
AVIF r/w | FITS r | MEF r/w |
|
4408
|
-
AZW r | FLA r | MIE r/w/c |
|
4409
|
-
BMP r | FLAC r | MIFF r |
|
4410
|
-
BPG r | FLIF r/w | MKA r |
|
4411
|
-
BTF r | FLV r | MKS r |
|
4412
|
-
CHM r | FPF r | MKV r |
|
4413
|
-
COS r | FPX r | MNG r/w |
|
4414
|
-
CR2 r/w | GIF r/w | MOBI r |
|
4415
|
-
CR3 r/w | GPR r/w | MODD r |
|
4416
|
-
CRM r/w | GZ r | MOI r |
|
4417
|
-
CRW r/w | HDP r/w | MOS r/w |
|
4418
|
-
CS1 r/w | HDR r | MOV r/w |
|
4419
|
-
CSV r | HEIC r/w | MP3 r |
|
4420
|
-
CZI r | HEIF r/w | MP4 r/w |
|
4421
|
-
DCM r | HTML r | MPC r |
|
4422
|
-
DCP r/w | ICC r/w/c | MPG r |
|
4423
|
-
DCR r | ICS r | MPO r/w |
|
4424
|
-
DFONT r | IDML r | MQV r/w |
|
4425
|
-
DIVX r | IIQ r/w | MRW r/w |
|
4426
|
-
DJVU r | IND r/w | MXF r |
|
4427
|
-
DLL r | INSP r/w | NEF r/w |
|
4428
|
-
DNG r/w | INSV r | NRW r/w |
|
4429
|
-
DOC r | INX r | NUMBERS r |
|
4430
|
-
DOCX r | ISO r | O 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
|
-
|
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.
|
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.
|
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<-
|
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
|
6421
|
-
if no duplicates existed, thus preventing the file from being
|
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
|
|