exiftool_vendored 12.09.0 → 12.14.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.
- checksums.yaml +4 -4
- data/bin/Changes +76 -5
- data/bin/MANIFEST +3 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +3 -3
- data/bin/exiftool +156 -64
- data/bin/lib/File/RandomAccess.pm +1 -1
- data/bin/lib/File/RandomAccess.pod +2 -2
- data/bin/lib/Image/ExifTool.pm +18 -10
- data/bin/lib/Image/ExifTool.pod +14 -10
- data/bin/lib/Image/ExifTool/AES.pm +1 -1
- data/bin/lib/Image/ExifTool/AFCP.pm +1 -1
- data/bin/lib/Image/ExifTool/AIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/APE.pm +1 -1
- data/bin/lib/Image/ExifTool/APP12.pm +1 -1
- data/bin/lib/Image/ExifTool/ASF.pm +1 -1
- data/bin/lib/Image/ExifTool/Apple.pm +1 -1
- data/bin/lib/Image/ExifTool/Audible.pm +1 -1
- data/bin/lib/Image/ExifTool/BMP.pm +1 -1
- data/bin/lib/Image/ExifTool/BPG.pm +1 -1
- data/bin/lib/Image/ExifTool/BZZ.pm +1 -1
- data/bin/lib/Image/ExifTool/BigTIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +10 -4
- data/bin/lib/Image/ExifTool/Canon.pm +20 -15
- data/bin/lib/Image/ExifTool/CanonCustom.pm +1 -1
- data/bin/lib/Image/ExifTool/CanonRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/CanonVRD.pm +1 -1
- data/bin/lib/Image/ExifTool/CaptureOne.pm +1 -1
- data/bin/lib/Image/ExifTool/Casio.pm +1 -1
- data/bin/lib/Image/ExifTool/Charset.pm +1 -1
- data/bin/lib/Image/ExifTool/DICOM.pm +1 -1
- data/bin/lib/Image/ExifTool/DJI.pm +1 -1
- data/bin/lib/Image/ExifTool/DNG.pm +1 -1
- data/bin/lib/Image/ExifTool/DPX.pm +1 -1
- data/bin/lib/Image/ExifTool/DV.pm +1 -1
- data/bin/lib/Image/ExifTool/DarwinCore.pm +1 -1
- data/bin/lib/Image/ExifTool/DjVu.pm +1 -1
- data/bin/lib/Image/ExifTool/EXE.pm +1 -1
- data/bin/lib/Image/ExifTool/Exif.pm +14 -1
- data/bin/lib/Image/ExifTool/FITS.pm +1 -1
- data/bin/lib/Image/ExifTool/FLAC.pm +1 -1
- data/bin/lib/Image/ExifTool/FLIF.pm +1 -1
- data/bin/lib/Image/ExifTool/FLIR.pm +1 -1
- data/bin/lib/Image/ExifTool/Fixup.pm +1 -1
- data/bin/lib/Image/ExifTool/Flash.pm +1 -1
- data/bin/lib/Image/ExifTool/FlashPix.pm +1 -1
- data/bin/lib/Image/ExifTool/Font.pm +1 -1
- data/bin/lib/Image/ExifTool/FotoStation.pm +1 -1
- data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -1
- data/bin/lib/Image/ExifTool/GE.pm +1 -1
- data/bin/lib/Image/ExifTool/GIF.pm +1 -1
- data/bin/lib/Image/ExifTool/GIMP.pm +1 -1
- data/bin/lib/Image/ExifTool/GPS.pm +1 -1
- data/bin/lib/Image/ExifTool/GeoTiff.pm +1 -1
- data/bin/lib/Image/ExifTool/Geotag.pm +30 -11
- data/bin/lib/Image/ExifTool/GoPro.pm +1 -1
- data/bin/lib/Image/ExifTool/H264.pm +1 -1
- data/bin/lib/Image/ExifTool/HP.pm +1 -1
- data/bin/lib/Image/ExifTool/HTML.pm +1 -1
- data/bin/lib/Image/ExifTool/HtmlDump.pm +1 -1
- data/bin/lib/Image/ExifTool/ICC_Profile.pm +1 -1
- data/bin/lib/Image/ExifTool/ID3.pm +1 -1
- data/bin/lib/Image/ExifTool/IPTC.pm +1 -1
- data/bin/lib/Image/ExifTool/ISO.pm +1 -1
- data/bin/lib/Image/ExifTool/ITC.pm +1 -1
- data/bin/lib/Image/ExifTool/Import.pm +15 -12
- data/bin/lib/Image/ExifTool/InDesign.pm +1 -1
- data/bin/lib/Image/ExifTool/JPEG.pm +1 -1
- data/bin/lib/Image/ExifTool/JPEGDigest.pm +1 -1
- data/bin/lib/Image/ExifTool/JSON.pm +1 -1
- data/bin/lib/Image/ExifTool/JVC.pm +1 -1
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +9 -4
- data/bin/lib/Image/ExifTool/Kodak.pm +1 -1
- data/bin/lib/Image/ExifTool/KyoceraRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/LNK.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/cs.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/de.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/en_ca.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/en_gb.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/es.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/fi.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/fr.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/it.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/ja.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/ko.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/nl.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/pl.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/ru.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/sv.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/tr.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/zh_cn.pm +1 -1
- data/bin/lib/Image/ExifTool/Lang/zh_tw.pm +1 -1
- data/bin/lib/Image/ExifTool/Leaf.pm +1 -1
- data/bin/lib/Image/ExifTool/Lytro.pm +1 -1
- data/bin/lib/Image/ExifTool/M2TS.pm +1 -1
- data/bin/lib/Image/ExifTool/MIE.pm +1 -1
- data/bin/lib/Image/ExifTool/MIEUnits.pod +1 -1
- data/bin/lib/Image/ExifTool/MIFF.pm +1 -1
- data/bin/lib/Image/ExifTool/MNG.pm +1 -1
- data/bin/lib/Image/ExifTool/MOI.pm +1 -1
- data/bin/lib/Image/ExifTool/MPC.pm +1 -1
- data/bin/lib/Image/ExifTool/MPEG.pm +1 -1
- data/bin/lib/Image/ExifTool/MPF.pm +3 -3
- data/bin/lib/Image/ExifTool/MWG.pm +1 -1
- data/bin/lib/Image/ExifTool/MXF.pm +1 -1
- data/bin/lib/Image/ExifTool/MacOS.pm +4 -2
- data/bin/lib/Image/ExifTool/MakerNotes.pm +1 -1
- data/bin/lib/Image/ExifTool/Matroska.pm +1 -1
- data/bin/lib/Image/ExifTool/Microsoft.pm +1 -1
- data/bin/lib/Image/ExifTool/Minolta.pm +1 -1
- data/bin/lib/Image/ExifTool/MinoltaRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/Motorola.pm +1 -1
- data/bin/lib/Image/ExifTool/Nikon.pm +7 -5
- data/bin/lib/Image/ExifTool/NikonCapture.pm +1 -1
- data/bin/lib/Image/ExifTool/NikonCustom.pm +1 -1
- data/bin/lib/Image/ExifTool/Nintendo.pm +1 -1
- data/bin/lib/Image/ExifTool/OOXML.pm +1 -1
- data/bin/lib/Image/ExifTool/Ogg.pm +1 -1
- data/bin/lib/Image/ExifTool/Olympus.pm +4 -2
- data/bin/lib/Image/ExifTool/OpenEXR.pm +1 -1
- data/bin/lib/Image/ExifTool/Opus.pm +1 -1
- data/bin/lib/Image/ExifTool/PCX.pm +1 -1
- data/bin/lib/Image/ExifTool/PDF.pm +10 -2
- data/bin/lib/Image/ExifTool/PGF.pm +1 -1
- data/bin/lib/Image/ExifTool/PICT.pm +1 -1
- data/bin/lib/Image/ExifTool/PLIST.pm +1 -1
- data/bin/lib/Image/ExifTool/PLUS.pm +1 -1
- data/bin/lib/Image/ExifTool/PNG.pm +1 -1
- data/bin/lib/Image/ExifTool/PPM.pm +1 -1
- data/bin/lib/Image/ExifTool/PSP.pm +1 -1
- data/bin/lib/Image/ExifTool/Palm.pm +1 -1
- data/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
- data/bin/lib/Image/ExifTool/PanasonicRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/Parrot.pm +1 -1
- data/bin/lib/Image/ExifTool/Pentax.pm +12 -4
- data/bin/lib/Image/ExifTool/PhaseOne.pm +1 -1
- data/bin/lib/Image/ExifTool/PhotoCD.pm +1 -1
- data/bin/lib/Image/ExifTool/PhotoMechanic.pm +1 -1
- data/bin/lib/Image/ExifTool/Photoshop.pm +1 -1
- data/bin/lib/Image/ExifTool/PostScript.pm +1 -1
- data/bin/lib/Image/ExifTool/PrintIM.pm +1 -1
- data/bin/lib/Image/ExifTool/Qualcomm.pm +1 -1
- data/bin/lib/Image/ExifTool/QuickTime.pm +28 -18
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +24 -3
- data/bin/lib/Image/ExifTool/RIFF.pm +82 -5
- data/bin/lib/Image/ExifTool/RSRC.pm +1 -1
- data/bin/lib/Image/ExifTool/RTF.pm +1 -1
- data/bin/lib/Image/ExifTool/Radiance.pm +1 -1
- data/bin/lib/Image/ExifTool/Rawzor.pm +1 -1
- data/bin/lib/Image/ExifTool/Real.pm +1 -1
- data/bin/lib/Image/ExifTool/Reconyx.pm +1 -1
- data/bin/lib/Image/ExifTool/Red.pm +1 -1
- data/bin/lib/Image/ExifTool/Ricoh.pm +1 -1
- data/bin/lib/Image/ExifTool/Samsung.pm +1 -1
- data/bin/lib/Image/ExifTool/Sanyo.pm +1 -1
- data/bin/lib/Image/ExifTool/Scalado.pm +1 -1
- data/bin/lib/Image/ExifTool/Shift.pl +1 -1
- data/bin/lib/Image/ExifTool/Shortcuts.pm +1 -1
- data/bin/lib/Image/ExifTool/Sigma.pm +1 -1
- data/bin/lib/Image/ExifTool/SigmaRaw.pm +1 -1
- data/bin/lib/Image/ExifTool/Sony.pm +16 -12
- data/bin/lib/Image/ExifTool/SonyIDC.pm +1 -1
- data/bin/lib/Image/ExifTool/Stim.pm +3 -3
- data/bin/lib/Image/ExifTool/TagInfoXML.pm +2 -2
- data/bin/lib/Image/ExifTool/TagLookup.pm +7 -1
- data/bin/lib/Image/ExifTool/TagNames.pod +41 -13
- data/bin/lib/Image/ExifTool/Text.pm +1 -1
- data/bin/lib/Image/ExifTool/Theora.pm +1 -1
- data/bin/lib/Image/ExifTool/Torrent.pm +1 -1
- data/bin/lib/Image/ExifTool/Unknown.pm +1 -1
- data/bin/lib/Image/ExifTool/VCard.pm +1 -1
- data/bin/lib/Image/ExifTool/Validate.pm +1 -1
- data/bin/lib/Image/ExifTool/Vorbis.pm +1 -1
- data/bin/lib/Image/ExifTool/WTV.pm +1 -1
- data/bin/lib/Image/ExifTool/WriteCanonRaw.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePDF.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePNG.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePhotoshop.pl +1 -1
- data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -1
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +5 -4
- data/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
- data/bin/lib/Image/ExifTool/Writer.pl +31 -17
- data/bin/lib/Image/ExifTool/XMP.pm +17 -8
- data/bin/lib/Image/ExifTool/XMP2.pl +6 -1
- data/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
- data/bin/lib/Image/ExifTool/ZIP.pm +1 -1
- data/bin/lib/Image/ExifTool/ZISRAW.pm +1 -1
- data/bin/lib/Image/ExifTool/iWork.pm +1 -1
- data/bin/perl-Image-ExifTool.spec +1 -1
- 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: 1529a49f0175445c31e6d5a6607546d958e2b08ce2c044d43232ac07f51a6fb5
|
4
|
+
data.tar.gz: bc6637fc0ef323192aa5e6c7e8553520f2d0acd9039e870ae1f9340fa00445c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03fa438994202e58a6c85ae0715018f89ca76c3f0fbfa87a9a8438b5c73637ed53d92491759f63926e3c57cefb2ec5f22dadd8b67c04d20a8e06aaa33f0328c0
|
7
|
+
data.tar.gz: 5e2cd8a33c4d66057bf115cd6f3bf3adaab426a44d8988747581d21478c81325e3cc88410b783cb6da7a55efbc04f7bc448291d509baf248995d10cfdcdeea0f
|
data/bin/Changes
CHANGED
@@ -5,7 +5,80 @@ 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
|
+
Jan. 6, 2021 - Version 12.14
|
11
|
+
|
12
|
+
- Added support for 2 more types of timed GPS in video files (that makes 49
|
13
|
+
different formats now supported)
|
14
|
+
- Added validity check for PDF trailer dictionary Size
|
15
|
+
- Added a new Pentax LensType
|
16
|
+
- Extract metadata from Jpeg2000 Association box
|
17
|
+
- Changed -g:XX:YY and -G:XX:YY options to show empty strings for non-existent
|
18
|
+
groups
|
19
|
+
- Patched to issue warning and avoid writing date/time values with a zero
|
20
|
+
month or day number
|
21
|
+
- Patched to avoid runtime warnings if trying to set FileName to an empty
|
22
|
+
string
|
23
|
+
- Fixed issue that could cause GPS test number 12 to fail on some systems
|
24
|
+
- Fixed problem extracting XML as a block from Jpeg2000 images, and extract
|
25
|
+
XML tags in the XML group instead of XMP
|
26
|
+
|
27
|
+
Dec. 24, 2020 - Version 12.13
|
28
|
+
|
29
|
+
- Added -i HIDDEN option to ignore files with names that start with "."
|
30
|
+
- Added a few new Nikon ShutterMode values (thanks Jan Skoda)
|
31
|
+
- Added ability to write Google GCamera MicroVideo XMP tags
|
32
|
+
- Add time zone automatically to most string-based QuickTime date/time tags
|
33
|
+
when writing unless the PrintConv option is disabled
|
34
|
+
- Decode a new Sony tag (thanks LibRaw)
|
35
|
+
- Changed behaviour when writing only pseudo tags to return an error and avoid
|
36
|
+
writing any other tags if writing FileName fails
|
37
|
+
- Print "X image files read" message even if only 1 file is read when at least
|
38
|
+
one other file has failed the -if condition
|
39
|
+
|
40
|
+
Dec. 4, 2020 - Version 12.12
|
41
|
+
|
42
|
+
- Added ability to geotag from DJI CSV log files
|
43
|
+
- Added a new CanonModelID
|
44
|
+
- Added a couple of new Sony LensType values (thanks LibRaw)
|
45
|
+
- Enhanced -csvDelim option to allow "\t", "\n", "\r" and "\\"
|
46
|
+
- Unescape "\b" and "\f" in imported JSON values
|
47
|
+
- Fixed bug introduced in 12.10 which generated a "Not an integer" warning
|
48
|
+
when attempting to shift some QuickTime date/time tags
|
49
|
+
- Fixed shared-write permission problem with -@ argfile when using -stay_open
|
50
|
+
and a filename containing special characters on Windows
|
51
|
+
|
52
|
+
Nov. 27, 2020 - Version 12.11
|
53
|
+
|
54
|
+
- Added -csvDelim option
|
55
|
+
- Added new Canon and Olympus LensType values (thanks LibRaw)
|
56
|
+
- Added a warning if ICC_Profile is deleted from an image (github issue #63)
|
57
|
+
- EndDir() function for -if option now works when -fileOrder is used
|
58
|
+
- Changed FileSize conversion to use binary prefixes since that is how the
|
59
|
+
conversion is currently done (eg. MiB instead of MB)
|
60
|
+
- Patched -csv option so columns aren't resorted when using -G option and one
|
61
|
+
of the tags is missing from a file
|
62
|
+
- Fixed incompatiblity with Google Photos when writing UserData:GPSCoordinates
|
63
|
+
to MP4 videos
|
64
|
+
- Fixed problem where the tags available in a -p format string were limited to
|
65
|
+
the same as the -if[NUM] option when NUM was specified
|
66
|
+
- Fixed incorrect decoding of SourceFileIndex/SourceDirectoryIndex for Ricoh
|
67
|
+
models
|
68
|
+
|
69
|
+
Nov. 12, 2020 - Version 12.10
|
70
|
+
|
71
|
+
- Added -validate test for proper TIFF magic number in JPEG EXIF header
|
72
|
+
- Added support for Nikon Z7 LensData version 0801
|
73
|
+
- Added a new XMP-GPano tag
|
74
|
+
- Decode ColorData for the Canon EOS 1DXmkIII (thanks LibRaw)
|
75
|
+
- Decode more tags for the Sony ILCE-7SM3 (thanks Jos Roost)
|
76
|
+
- Automatically apply QuickTimeUTC option for CR3 files
|
77
|
+
- Improved decoding of XAttrMDLabel from MacOS files
|
78
|
+
- Ignore time zones when writing date/time values and using the -d option
|
79
|
+
- Enhanced -echo3 and -echo4 options to allow exit status to be returned
|
80
|
+
- Changed -execute so the -q option no longer suppresses the "{ready}" message
|
81
|
+
when a synchronization number is used (eg. -execute123)
|
9
82
|
|
10
83
|
Oct. 29, 2020 - Version 12.09
|
11
84
|
|
@@ -17,15 +90,14 @@ Oct. 29, 2020 - Version 12.09
|
|
17
90
|
- Added a new Sony LensType (thanks Jos Roost)
|
18
91
|
- Added a new Nikon Z lens (thanks LibRaw)
|
19
92
|
- Added a new Canon LensType
|
20
|
-
- Added a new XMP-crs tag
|
21
93
|
- Decode ColorData for Canon EOS R5/R6
|
22
94
|
- Decode a couple of new HEIF tags
|
23
95
|
- Decode FirmwareVersion for Canon M50
|
24
|
-
- Patched EndDir() feature so subdirectories are always processed when -r is
|
25
|
-
used (previously, EndDir() would end processing of a directory completely)
|
26
96
|
- Improved decoding of Sony CreativeStyle tags (thanks Jos Roost)
|
27
97
|
- Improved parsing of Radiance files to recognize comments
|
28
98
|
- Renamed GIF AspectRatio tag to PixelAspectRatio
|
99
|
+
- Patched EndDir() feature so subdirectories are always processed when -r is
|
100
|
+
used (previously, EndDir() would end processing of a directory completely)
|
29
101
|
- Yet another tweak to the EventTime formatting rules (also allow time-only
|
30
102
|
values with fractional seconds and a time zone)
|
31
103
|
- Avoid loading GoPro module unnecessarily when reading MP4 videos from some
|
@@ -33,7 +105,6 @@ Oct. 29, 2020 - Version 12.09
|
|
33
105
|
- Fixed problem with an incorrect naming of CodecID tags in some MKV videos
|
34
106
|
- Fixed verbose output to avoid "adding" messages for existing flattened XMP
|
35
107
|
tags
|
36
|
-
- Added read support for MacOS "._" sidecar files
|
37
108
|
|
38
109
|
Oct. 15, 2020 - Version 12.08
|
39
110
|
|
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
|
@@ -602,6 +603,7 @@ t/Jpeg2000.t
|
|
602
603
|
t/Jpeg2000_2.out
|
603
604
|
t/Jpeg2000_3.out
|
604
605
|
t/Jpeg2000_4.out
|
606
|
+
t/Jpeg2000_5.out
|
605
607
|
t/Kodak.t
|
606
608
|
t/Kodak_2.out
|
607
609
|
t/Kodak_3.out
|
@@ -986,6 +988,7 @@ t/images/Geotag.log
|
|
986
988
|
t/images/Geotag.xml
|
987
989
|
t/images/Geotag2.log
|
988
990
|
t/images/Geotag3.log
|
991
|
+
t/images/Geotag_DJI_2020-12-02_[07-50-31].csv
|
989
992
|
t/images/GoPro.jpg
|
990
993
|
t/images/HTML.html
|
991
994
|
t/images/ICC_Profile.icc
|
data/bin/META.json
CHANGED
data/bin/META.yml
CHANGED
data/bin/README
CHANGED
@@ -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.14.tar.gz | tar -xf -
|
110
|
+
cd Image-ExifTool-12.14
|
111
111
|
./exiftool t/images/ExifTool.jpg
|
112
112
|
|
113
113
|
Note: These commands extract meta information from one of the test images.
|
@@ -161,7 +161,7 @@ for calculating digest values and providing other features listed below:
|
|
161
161
|
|
162
162
|
COPYRIGHT AND LICENSE
|
163
163
|
|
164
|
-
Copyright 2003-
|
164
|
+
Copyright 2003-2021, Phil Harvey
|
165
165
|
|
166
166
|
This is free software; you can redistribute it and/or modify it under the
|
167
167
|
same terms as Perl itself.
|
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.14';
|
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
|
}
|
@@ -2818,6 +2858,10 @@ sub SetImageInfo($$$)
|
|
2818
2858
|
# determine what our output file name should be
|
2819
2859
|
my $newFileName = $et->GetNewValues('FileName');
|
2820
2860
|
my $newDir = $et->GetNewValues('Directory');
|
2861
|
+
if (defined $newFileName and not length $newFileName) {
|
2862
|
+
Warn "Warning: New file name is empty - $ infile\n";
|
2863
|
+
undef $newFileName;
|
2864
|
+
}
|
2821
2865
|
if (defined $testName) {
|
2822
2866
|
my $err;
|
2823
2867
|
$err = "You shouldn't write FileName or Directory with TestFile" if defined $newFileName or defined $newDir;
|
@@ -2896,14 +2940,19 @@ sub SetImageInfo($$$)
|
|
2896
2940
|
}
|
2897
2941
|
# quickly rename file and/or set file date if this is all we are doing
|
2898
2942
|
if ($numSet == $numPseudo) {
|
2899
|
-
my $r1 =
|
2900
|
-
|
2901
|
-
|
2902
|
-
|
2903
|
-
|
2904
|
-
|
2943
|
+
my ($r0, $r1, $r2, $r3) = (0, 0, 0, 0);
|
2944
|
+
if (defined $outfile) {
|
2945
|
+
$r0 = $et->SetFileName($file, $outfile);
|
2946
|
+
$file = $$et{NewName} if $r0 > 0; # continue with new name if changed
|
2947
|
+
}
|
2948
|
+
unless ($r0 < 0) {
|
2949
|
+
$r1 = $et->SetFileModifyDate($file,undef,'FileCreateDate');
|
2950
|
+
$r2 = $et->SetFileModifyDate($file);
|
2951
|
+
$r3 = $et->SetSystemTags($file);
|
2952
|
+
}
|
2953
|
+
if ($r0 > 0 or $r1 > 0 or $r2 > 0 or $r3 > 0) {
|
2905
2954
|
++$countGoodWr;
|
2906
|
-
} elsif ($
|
2955
|
+
} elsif ($r0 < 0 or $r1 < 0 or $r2 < 0 or $r3 < 0) {
|
2907
2956
|
EFile($infile);
|
2908
2957
|
++$countBadWr;
|
2909
2958
|
return 0;
|
@@ -2912,8 +2961,7 @@ sub SetImageInfo($$$)
|
|
2912
2961
|
++$countSameWr;
|
2913
2962
|
}
|
2914
2963
|
if (defined $hardLink or defined $symLink or defined $testName) {
|
2915
|
-
|
2916
|
-
DoHardLink($et, $src, $hardLink, $symLink, $testName);
|
2964
|
+
DoHardLink($et, $file, $hardLink, $symLink, $testName);
|
2917
2965
|
}
|
2918
2966
|
return 1;
|
2919
2967
|
}
|
@@ -3290,7 +3338,7 @@ sub FormatCSV($)
|
|
3290
3338
|
# the -b option is used to encode as Base64. It is unclear whether or not this
|
3291
3339
|
# is valid CSV, but some readers may not like it. (If this becomes a problem,
|
3292
3340
|
# 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 =~ /[
|
3341
|
+
$val = qq{"$val"} if $val =~ s/"/""/g or $val =~ /(^\s+|\s+$)/ or $val =~ /[\n\r]|\Q$csvDelim/;
|
3294
3342
|
return $val;
|
3295
3343
|
}
|
3296
3344
|
|
@@ -3303,9 +3351,9 @@ sub PrintCSV()
|
|
3303
3351
|
@csvTags or @csvTags = sort keys %csvTags;
|
3304
3352
|
# make a list of tags actually found
|
3305
3353
|
foreach $lcTag (@csvTags) {
|
3306
|
-
push @tags, $csvTags{$lcTag} if $csvTags{$lcTag};
|
3354
|
+
push @tags, FormatCSV($csvTags{$lcTag}) if $csvTags{$lcTag};
|
3307
3355
|
}
|
3308
|
-
print join(
|
3356
|
+
print join($csvDelim, 'SourceFile', @tags), "\n";
|
3309
3357
|
my $empty = defined($forcePrint) ? $forcePrint : '';
|
3310
3358
|
foreach $file (@csvFiles) {
|
3311
3359
|
my @vals = (FormatCSV($file)); # start with full file name
|
@@ -3316,7 +3364,7 @@ sub PrintCSV()
|
|
3316
3364
|
defined $val or push(@vals,$empty), next;
|
3317
3365
|
push @vals, FormatCSV($val);
|
3318
3366
|
}
|
3319
|
-
print join(
|
3367
|
+
print join($csvDelim, @vals), "\n";
|
3320
3368
|
}
|
3321
3369
|
}
|
3322
3370
|
|
@@ -3552,8 +3600,18 @@ sub ProcessFiles($;$)
|
|
3552
3600
|
if ($list) {
|
3553
3601
|
push(@$list, $file);
|
3554
3602
|
} else {
|
3603
|
+
if (%endDir) {
|
3604
|
+
my ($d, $f) = Image::ExifTool::SplitFileName($file);
|
3605
|
+
next if $endDir{$d};
|
3606
|
+
}
|
3555
3607
|
GetImageInfo($et, $file);
|
3556
3608
|
$end and Warn("End called - $file\n");
|
3609
|
+
if ($endDir) {
|
3610
|
+
Warn("EndDir called - $file\n");
|
3611
|
+
my ($d, $f) = Image::ExifTool::SplitFileName($file);
|
3612
|
+
$endDir{$d} = 1;
|
3613
|
+
undef $endDir;
|
3614
|
+
}
|
3557
3615
|
}
|
3558
3616
|
}
|
3559
3617
|
$et->Options(CharsetFileName => $enc) if $utf8FileName{$file};
|
@@ -3639,6 +3697,7 @@ sub ScanDir($$;$)
|
|
3639
3697
|
next;
|
3640
3698
|
}
|
3641
3699
|
next if $endThisDir;
|
3700
|
+
next if $ignoreHidden and $file =~ /^\./; # ignore hidden files if specified
|
3642
3701
|
# apply rules from -ext options
|
3643
3702
|
my $accepted;
|
3644
3703
|
if ($filterFlag) {
|
@@ -3683,8 +3742,9 @@ sub ScanDir($$;$)
|
|
3683
3742
|
if ($endDir) {
|
3684
3743
|
$path =~ s(/$)();
|
3685
3744
|
Warn("EndDir called - $path\n");
|
3686
|
-
|
3745
|
+
$endDir{$path} = 1;
|
3687
3746
|
$endThisDir = 1;
|
3747
|
+
undef $endDir;
|
3688
3748
|
}
|
3689
3749
|
}
|
3690
3750
|
}
|
@@ -4478,6 +4538,7 @@ L<Input-output text formatting|/Input-output text formatting>
|
|
4478
4538
|
-c FMT (-coordFormat) Set format for GPS coordinates
|
4479
4539
|
-charset [[TYPE=]CHARSET] Specify encoding for special characters
|
4480
4540
|
-csv[[+]=CSVFILE] Export/import tags in CSV format
|
4541
|
+
-csvDelim STR Set delimiter for CSV file
|
4481
4542
|
-d FMT (-dateFormat) Set format for date/time values
|
4482
4543
|
-D (-decimal) Show tag ID numbers in decimal
|
4483
4544
|
-E,-ex,-ec (-escape(HTML|XML|C))Escape tag values for HTML, XML or C
|
@@ -4997,8 +5058,11 @@ tag names (with optional group names) for each column of the file, and
|
|
4997
5058
|
values must be separated by commas. A special "SourceFile" column specifies
|
4998
5059
|
the files associated with each row of information (and a SourceFile of "*"
|
4999
5060
|
may be used to define default tags to be imported for all files which are
|
5000
|
-
combined with any tags specified for the specific SourceFile processed).
|
5001
|
-
|
5061
|
+
combined with any tags specified for the specific SourceFile processed). The
|
5062
|
+
B<-csvDelim> option may be used to change the input/output field delimiter
|
5063
|
+
if something other than a comma is required.
|
5064
|
+
|
5065
|
+
The following examples demonstrate basic use of the B<-csv> option:
|
5002
5066
|
|
5003
5067
|
# generate CSV file with common tags from all images in a directory
|
5004
5068
|
exiftool -common -csv dir > out.csv
|
@@ -5045,6 +5109,13 @@ option. When processing a large number of files, it is recommended to
|
|
5045
5109
|
either use the JSON (B<-j>) or XML (B<-X>) output format, or use B<-p> to
|
5046
5110
|
generate a fixed-column CSV file instead of using the B<-csv> option.
|
5047
5111
|
|
5112
|
+
=item B<-csvDelim> I<STR>
|
5113
|
+
|
5114
|
+
Set the delimiter for separating CSV entries for CSV file input/output via
|
5115
|
+
the B<-csv> option. I<STR> may contain "\t", "\n", "\r" and "\\" to
|
5116
|
+
represent TAB, LF, CR and '\' respectively. A double quote is not allowed
|
5117
|
+
in the delimiter. Default is ','.
|
5118
|
+
|
5048
5119
|
=item B<-d> I<FMT> (B<-dateFormat>)
|
5049
5120
|
|
5050
5121
|
Set the format for date/time tag values. The I<FMT> string may contain
|
@@ -5296,7 +5367,7 @@ with this command:
|
|
5296
5367
|
|
5297
5368
|
produces output like this:
|
5298
5369
|
|
5299
|
-
-- Generated by ExifTool 12.
|
5370
|
+
-- Generated by ExifTool 12.14 --
|
5300
5371
|
File: a.jpg - 2003:10:31 15:44:19
|
5301
5372
|
(f/5.6, 1/60s, ISO 100)
|
5302
5373
|
File: b.jpg - 2006:05:23 11:57:38
|
@@ -5704,7 +5775,8 @@ extracting any EXIF MakerNote information. B<-fast3> avoids extracting
|
|
5704
5775
|
metadata from the file, and returns only pseudo System tags, but still reads
|
5705
5776
|
the file header to obtain an educated guess at FileType. B<-fast4> doesn't
|
5706
5777
|
even read the file header, and returns only System tags and a FileType based
|
5707
|
-
on the file extension.
|
5778
|
+
on the file extension. B<-fast5> also disables generation of the Composite
|
5779
|
+
tags (like B<-e>). Has no effect when writing.
|
5708
5780
|
|
5709
5781
|
Note that a separate B<-fast> setting may be used for evaluation of a B<-if>
|
5710
5782
|
condition, or when ordering files with the B<-fileOrder> option. See the
|
@@ -5729,7 +5801,9 @@ involves an additional processing pass of each file, but this impact may be
|
|
5729
5801
|
reduced by specifying a I<NUM> for the B<-fast> level used during the
|
5730
5802
|
metadata-extraction phase. For example, B<-fileOrder4> may be used if
|
5731
5803
|
I<TAG> is a pseudo System tag. If multiple B<-fileOrder> options are used,
|
5732
|
-
the extraction is done at the lowest B<-fast> level.
|
5804
|
+
the extraction is done at the lowest B<-fast> level. Note that files are
|
5805
|
+
sorted across directory boundaries if multiple input directories are
|
5806
|
+
specified.
|
5733
5807
|
|
5734
5808
|
=item B<-i> I<DIR> (B<-ignore>)
|
5735
5809
|
|
@@ -5738,7 +5812,9 @@ name, or a full path. If a full path is specified, it must match the
|
|
5738
5812
|
Directory tag exactly to be ignored. Use multiple B<-i> options to ignore
|
5739
5813
|
more than one directory name. A special I<DIR> value of C<SYMLINKS> (case
|
5740
5814
|
sensitive) may be specified to ignore symbolic links when the B<-r> option
|
5741
|
-
is used.
|
5815
|
+
is used. As well, a value of C<HIDDEN> (case sensitive) may be used to
|
5816
|
+
ignore files with names that start with a "." (ie. hidden files on Unix
|
5817
|
+
systems) when scanning a directory.
|
5742
5818
|
|
5743
5819
|
=item B<-if>[I<NUM>] I<EXPR>
|
5744
5820
|
|
@@ -5770,7 +5846,7 @@ Adding I<NUM> to the B<-if> option causes a separate processing pass to be
|
|
5770
5846
|
executed for evaluating I<EXPR> at a B<-fast> level given by I<NUM> (see the
|
5771
5847
|
B<-fast> option documentation for details). Without I<NUM>, only one
|
5772
5848
|
processing pass is done at the level specified by the B<-fast> option. For
|
5773
|
-
example, using B<-
|
5849
|
+
example, using B<-if5> is possible if I<EXPR> uses only pseudo System tags,
|
5774
5850
|
and may significantly speed processing if enough files fail the condition.
|
5775
5851
|
|
5776
5852
|
The expression has access to the current ExifTool object through C<$self>,
|
@@ -5779,7 +5855,8 @@ of the file processing. Both functions have a return value of 1. Case is
|
|
5779
5855
|
significant for function names.
|
5780
5856
|
|
5781
5857
|
End() - end processing after this file
|
5782
|
-
EndDir() - end processing of files in this directory
|
5858
|
+
EndDir() - end processing of files in this directory (not
|
5859
|
+
compatible with the B<-fileOrder> option)
|
5783
5860
|
|
5784
5861
|
Notes:
|
5785
5862
|
|
@@ -6241,7 +6318,9 @@ about the configuration file syntax.
|
|
6241
6318
|
Echo I<TEXT> to stdout (B<-echo> or B<-echo1>) or stderr (B<-echo2>). Text
|
6242
6319
|
is output as the command line is parsed, before the processing of any input
|
6243
6320
|
files. I<NUM> may also be 3 or 4 to output text (to stdout or stderr
|
6244
|
-
respectively) after processing is complete.
|
6321
|
+
respectively) after processing is complete. For B<-echo3> and B<-echo4>,
|
6322
|
+
"${status}" may be used in the I<TEXT> string to represent the numerical
|
6323
|
+
exit status of the command (see L</EXIT STATUS>).
|
6245
6324
|
|
6246
6325
|
=item B<-efile>[I<NUM>][!] I<ERRFILE>
|
6247
6326
|
|
@@ -6262,7 +6341,8 @@ commands were executed as separate command lines (with the exception of the
|
|
6262
6341
|
B<-config> and B<-use> options which remain in effect for subsequent
|
6263
6342
|
commands). Allows multiple commands to be executed from a single command
|
6264
6343
|
line. I<NUM> is an optional number that is echoed in the "{ready}" message
|
6265
|
-
when using the B<-stay_open> feature.
|
6344
|
+
when using the B<-stay_open> feature. If a I<NUM> is specified, the B<-q>
|
6345
|
+
option no longer suppresses the output "{readyNUM}" message.
|
6266
6346
|
|
6267
6347
|
=item B<-srcfile> I<FMT>
|
6268
6348
|
|
@@ -6293,10 +6373,10 @@ name and directory.
|
|
6293
6373
|
|
6294
6374
|
=item B<-stay_open> I<FLAG>
|
6295
6375
|
|
6296
|
-
If I<FLAG> is C<1> or C<True
|
6297
|
-
I<ARGFILE> even after reaching the end of file. This
|
6298
|
-
applications to pre-load exiftool, thus avoiding the
|
6299
|
-
exiftool for each command. The procedure is as follows:
|
6376
|
+
If I<FLAG> is C<1> or C<True> (case insensitive), causes exiftool keep
|
6377
|
+
reading from the B<-@> I<ARGFILE> even after reaching the end of file. This
|
6378
|
+
feature allows calling applications to pre-load exiftool, thus avoiding the
|
6379
|
+
overhead of loading exiftool for each command. The procedure is as follows:
|
6300
6380
|
|
6301
6381
|
1) Execute C<exiftool -stay_open True -@ I<ARGFILE>>, where I<ARGFILE> is the
|
6302
6382
|
name of an existing (possibly empty) argument file or C<-> to pipe arguments
|
@@ -6312,12 +6392,16 @@ received up to this point, send a "{ready}" message to stdout when done
|
|
6312
6392
|
(unless the B<-q> or B<-T> option is used), and continue trying to read
|
6313
6393
|
arguments for the next command from I<ARGFILE>. To aid in command/response
|
6314
6394
|
synchronization, any number appended to the C<-execute> option is echoed in
|
6315
|
-
the "{ready}" message. For example, C<-execute613> results in "{ready613}".
|
6395
|
+
the "{ready}" message. For example, C<-execute613> results in "{ready613}".
|
6396
|
+
When this number is added, B<-q> no longer suppresses the "{ready}" message.
|
6397
|
+
(Also, see the B<-echo3> and B<-echo4> options for additional ways to pass
|
6398
|
+
signals back to your application.)
|
6316
6399
|
|
6317
6400
|
4) Repeat steps 2 and 3 for each command.
|
6318
6401
|
|
6319
|
-
5) Write C<-stay_open\nFalse\n> to I<ARGFILE> when
|
6320
|
-
exiftool to process any remaining command-line
|
6402
|
+
5) Write C<-stay_open\nFalse\n> (or C<-stay_open\n0\n>) to I<ARGFILE> when
|
6403
|
+
done. This will cause exiftool to process any remaining command-line
|
6404
|
+
arguments then exit normally.
|
6321
6405
|
|
6322
6406
|
The input I<ARGFILE> may be changed at any time before step 5 above by
|
6323
6407
|
writing the following lines to the currently open I<ARGFILE>:
|
@@ -6327,7 +6411,7 @@ writing the following lines to the currently open I<ARGFILE>:
|
|
6327
6411
|
-@
|
6328
6412
|
NEWARGFILE
|
6329
6413
|
|
6330
|
-
This causes I<ARGFILE> to be closed, and I<NEWARGFILE> to be kept open.
|
6414
|
+
This causes I<ARGFILE> to be closed, and I<NEWARGFILE> to be kept open.
|
6331
6415
|
(Without the B<-stay_open> here, exiftool would have returned to reading
|
6332
6416
|
arguments from I<ARGFILE> after reaching the end of I<NEWARGFILE>.)
|
6333
6417
|
|
@@ -6345,10 +6429,11 @@ an interface to the API UserParam option (see the
|
|
6345
6429
|
L<Image::ExifTool Options|Image::ExifTool/Options> documentation), and
|
6346
6430
|
provides a method to access user-defined parameters in arguments to the
|
6347
6431
|
B<-if> and B<-p> options as if they were any other tag. Appending a hash
|
6348
|
-
tag (C<#>) to I<PARAM> also causes the
|
6349
|
-
tag
|
6350
|
-
value is set to 1 if I<=VAL> is
|
6351
|
-
|
6432
|
+
tag (C<#>) to I<PARAM> (eg. C<-userParam MyTag#=yes>) also causes the
|
6433
|
+
parameter to be extracted as a normal tag in the UserParam group. Similar
|
6434
|
+
to the B<-api> option, the parameter value is set to 1 if I<=VAL> is
|
6435
|
+
omitted, undef if just I<VAL> is omitted with C<=>, or an empty string if
|
6436
|
+
I<VAL> is omitted with C<^=>.
|
6352
6437
|
|
6353
6438
|
exiftool -p '$test from $filename' -userparam test=Hello FILE
|
6354
6439
|
|
@@ -6418,9 +6503,9 @@ For example, the following command may be used to remove duplicate Keywords:
|
|
6418
6503
|
The B<-sep> option is necessary to split the string back into individual
|
6419
6504
|
list items when writing to a list-type tag.
|
6420
6505
|
|
6421
|
-
An optional flag argument may be set to 1 to cause C<NoDups> to
|
6422
|
-
if no duplicates existed, thus preventing the file from being
|
6423
|
-
unnecessarily:
|
6506
|
+
An optional flag argument may be set to 1 to cause C<NoDups> to set C<$_> to
|
6507
|
+
undef if no duplicates existed, thus preventing the file from being
|
6508
|
+
rewritten unnecessarily:
|
6424
6509
|
|
6425
6510
|
exiftool -sep '##' '-keywords<${keywords;NoDups(1)}' a.jpg
|
6426
6511
|
|
@@ -7058,6 +7143,13 @@ flexibility of ExifTool.)
|
|
7058
7143
|
|
7059
7144
|
=back
|
7060
7145
|
|
7146
|
+
=head1 INTERRUPTING EXIFTOOL
|
7147
|
+
|
7148
|
+
Interrupting exiftool with a CTRL-C or SIGINT will not result in partially
|
7149
|
+
written files or temporary files remaining on the hard disk. The exiftool
|
7150
|
+
application traps SIGINT and defers it until the end of critical processes
|
7151
|
+
if necessary, then does a proper cleanup before exiting.
|
7152
|
+
|
7061
7153
|
=head1 EXIT STATUS
|
7062
7154
|
|
7063
7155
|
The exiftool application exits with a status of 0 on success, or 1 if an
|
@@ -7066,7 +7158,7 @@ the commands if B<-execute> was used).
|
|
7066
7158
|
|
7067
7159
|
=head1 AUTHOR
|
7068
7160
|
|
7069
|
-
Copyright 2003-
|
7161
|
+
Copyright 2003-2021, Phil Harvey
|
7070
7162
|
|
7071
7163
|
This is free software; you can redistribute it and/or modify it under the
|
7072
7164
|
same terms as Perl itself.
|