1. Discussion forum
  2. Determining tag names
  3. Problems with duplicate tags
  4. Aperture and shutter speed
  5. Date and time formats
  6. "Can't convert TAG" errors
  7. Deleting all EXIF from a TIFF
  8. Writing Make, Model & MakerNotes
  9. Tag locations when copying
  10. Coded character sets
  11. User-defined tags
  12. Export to database
  13. Output file size
  14. GPS coordinate format
  15. MakerNote errors
  16. Some files not renamed
  17. List-type tags
  18. Windows character encoding
  19. Formatting tag values
  20. Write errors (repair corrupted EXIF)
  21. Newlines in values
  22. File names beginning with dash (-)
  23. "0 image files updated"

ExifTool FAQ

1. "Is there a forum for discussing ExifTool issues?"

ExifTool issues can be discussed on the ExifTool forum at http://owl.phy.queensu.ca/~phil/exiftool/forum/

2. "How do I determine the tag name for some information?"

When you run exiftool, by default it prints descriptions, not tag names, for the information it extracts. As well as other differences, descriptions often contain spaces between words but tag names never do. To print the tag names instead instead of descriptions, use the -s option when extracting information. Also, see the tag names documentation for a complete list of available tag names.
Tag names may be optionally prefixed by a family 0 or 1 group name to specify a particular information type or location. Use the -g0 and -g1 (or -G0 and -G1) options when extracting information to see the corresponding group names.

3a. "ExifTool reports the wrong value or doesn't extract a tag",
3b. "ExifTool doesn't write a tag properly", or
3c. "Other software can't read information written by ExifTool"

[Also see FAQ number 23 for reasons why ExifTool may not write some tags to certain file types.]
Make sure you are looking at the right information. Information may be duplicated in different locations within an image. When in doubt, use "exiftool -a -G1 FILENAME" to show all information and the locations in the file. In this command, -a allows duplicate tags to be extracted, -G1 shows the family 1 group name (ie. the location) of each tag, and "FILENAME" is the name of your image file. Also, it may be helpful to add -s to show the actual tag names instead of the descriptions (and possibly -D or -H to show the tag ID numbers if you are familiar with these).
When duplicate tags exist, only one is extracted unless the -a option is used. Beware that options like -EXIF:all select all EXIF tags from the extracted tags, so EXIF tags hidden by duplicate tags in other locations will not appear in the output for -EXIF:all. For example, the command
exiftool -gps:all image.jpg
will NOT necessarily extract all GPS tags because some GPS tags may have been suppressed by same-named tags in other groups. To be sure all GPS tags are extracted, the -a option must be used:
exiftool -a -gps:all image.jpg
If you are having problems with other software reading information written by ExifTool, if possible try first writing the information from the other software, then use ExifTool to determine where the information was written. Once you know where it should go, you can use ExifTool to write to this location. You can read or write information in a specific location by prefixing the tag name on the command line with the desired group name. ie) "-ExifIFD:DateTimeOriginal"
This problem may also occur if contradictory information exists in different meta information formats within the same file. The Metadata Working Group recommends techniques to keep the EXIF, IPTC and XMP metadata synchronized. These recommendations are implemented by the ExifTool MWG tags. For maximum compatibility with the widest range of applications, it is suggested that these MWG tags be used whenever possible.

4. "ExifTool reports more than one shutter speed or aperture value, and they are slightly different"

There are a number of different ways that aperture and shutter speed information are stored in many images. The standard EXIF values (EXIF:FNumber and EXIF:ExposureTime) should correspond to the values displayed by your camera, but these values may have been rounded off. The corresponding EXIF APEX values (EXIF:ApertureValue and EXIF:ShutterSpeedValue) may be different due to their own round-off errors. If available, the MakerNotes values may be the most accurate because they haven't been rounded off to nice even values for display, so with these you may see odd values like 1/102 instead of 1/100, etc.

5. "How do I format date and time information for writing?"

All information (including date/time information) is written in the same format as it is read out. When reading, ExifTool converts all date and time information to standard EXIF format, so this is also the way it is specified when writing. The standard EXIF date/time format is "YYYY:MM:DD hh:mm:ss", and some meta information formats such as XMP also allow sub-seconds and a timezone to be specified. The timezone format is "+hh:mm", "-hh:mm" or "Z". For example:
exiftool -xmp:dateTimeOriginal="2005:10:23 20:06:34.33-05:00" a.jpg
When writing XMP or other information types which allow incomplete date/time values, the following input formats are also accepted:
YYYY
YYYY:MM
YYYY:MM:DD
YYYY:MM:DD hh:mm
ExifTool will attempt to reformat input date/time values into the standard format unless the -n option is used.

6. "I get 'Can't convert TAG (not in PrintConv)' errors when writing a tag"

By default, ExifTool applies a print conversion (PrintConv) to extracted information to make the output more human-readable. Some conversions involve lookup tables which are documented in the Values column of the Tag Name documentation. For example, the GPSAltitudeRef tag defines the following conversions:
0 = Above Sea Level
1 = Below Sea Level
For this tag, a value of '0' is printed as 'Above Sea Level', and '1' is printed as 'Below Sea Level'. Reading and writing with ExifTool is symmetrical [with the possible exception of List-type tags -- see FAQ #17 below], so a value that is printed as 'Above Sea Level' must also be written in that form. (In other words, the inverse print conversion is applied when writing values.) For example, to write GPSAltitudeRef you can type:
exiftool -gpsaltituderef="Above Sea Level" image.jpg
or any unambiguous short form may be used and ExifTool will know what you mean, ie)
exiftool -gpsaltituderef=above image.jpg
Alternatively, the print conversion can be disabled for all tags with the -n option, or for individual tags by suffixing the tag name with a '#' character. In either case the printed value of GPSAltitudeRef will be '0' or '1' when extracting information, and the value is written in the same way. So following two commands have exactly the same effect as above:
exiftool -gpsaltituderef=0 -n image.jpg
exiftool -gpsaltituderef#=0 image.jpg
Integer values may also be specified in hexadecimal (with a leading '0x'). For example, the following commands are all equivalent:
exiftool -flash=1 -n image.jpg
exiftool -flash=0x1 -n image.jpg
exiftool -flash#=1 image.jpg
exiftool -flash#=0x1 image.jpg
exiftool -flash=fired image.jpg
Programmers: These techniques look like this when calling Image::ExifTool functions from a Perl script:
$exifTool->SetNewValue(flash => 1, Type => 'ValueConv');
$exifTool->SetNewValue(flash => 0x1, Type => 'ValueConv');
$exifTool->SetNewValue('flash#' => 1);
$exifTool->SetNewValue('flash#' => 0x1);
$exifTool->SetNewValue(flash => 'fired');

7. "I can't delete all EXIF information from a TIFF file using 'exiftool -exif:all= img.tif'"

This is because of the way a TIFF file is structured. With a JPEG image, this command removes IFD0 (the main Image File Directory) as well as any subdirectories, thus removing all EXIF information. But with the TIFF format, the main image itself is stored in IFD0, so deleting this directory would destroy the image. The same is true for any TIFF-based RAW file such as DNG, CR2, NEF, etc. For these types of files, ExifTool just deletes the ExifIFD subdirectory, so any information stored in other directories is preserved.
Use "exiftool -a -G1 -s img.tif" to see where the information is stored. Any tags remaining in other IFD's must be deleted individually from a TIFF-format file if desired. For convenience, a shortcut tag is provided to simplify the deletion of common metadata tags from IFD0 by adding "-CommonIFD0=" to the command line.

8a. "All maker note information is lost if I change the Make or Model tag", or
8b. "I can't copy maker note information to an image"

The Make and Model tags are used by some image utilities (including ExifTool) to determine the format of the maker note information. Deleting or changing either of these tags may prevent these utilities from recognizing or properly interpreting the maker notes. Also beware that the maker notes information may be damaged if an image is edited when the maker notes are not properly recognized. So it is a good idea not to edit the Make and Model tags in the first place.
If you really want to delete the Make and Model information, you might as well delete the maker notes too. You can do this with either of the following commands:
exiftool -make= -model= -makernotes:all= image.jpg
exiftool -make= -model= -makernotes= image.jpg
For the same reason, maker notes can not be copied to an image with an incompatible Make or Model. To do this, the Make and Model tags must also be copied. ie)
exiftool -tagsfromfile src.jpg -makernotes -make -model dst.jpg
(Note that in this case the "-makernotes:all" syntax does not work because it attempts to copy the maker note tags individually, but they must be copied as a block with "-makernotes".)

9a. "The information is different when I copy all tags to a new file", or
9b. "The tag locations change when I use -tagsfromfile to copy information"

This feature is explained under the -tagsFromFile option in the exiftool application documentation, but the question is common enough that it is discussed here in more detail.
By default, ExifTool will store information in preferred locations when either writing new information or copying information between files. This freedom allows ExifTool to write or copy information to files of different formats without requiring the user to know details about where the information is stored.
The preferred locations for information written to JPEG images are 1) EXIF, 2) IPTC and 3) XMP. As an example, information extracted from the maker notes will be preferentially written (on a tag-by-tag basis) in EXIF format when copying information between two JPEG images. But if a specific tag doesn't exist in EXIF, then the tag is written to the first valid group in the order specified above. The advantage of "translating" the information to EXIF is that it then becomes readable by applications which only support standard EXIF. The disadvantage is that you don't get an exact copy of the original information structure.
But ExifTool gives you the ability to customize this behaviour to write the information to wherever you want. This is done by specifying a group name for the tag(s) to be copied. This applies even if the group name is "all", in which case the original group is preserved. So to copy all information and preserve the original structure, use this syntax:
exiftool -tagsfromfile src.jpg -all:all dst.jpg
By specifying a group name with "-all:all", the location of the information is preserved. (Specifically, since no destination tag was specified the source group "all" was assumed, thus preserving the original group.)
Here are some examples to show you the type of control you have over where the information is written. All commands in each example are equivalent:
# copy all tags to preferred groups (no destination group)
exiftool -tagsfromfile src.jpg dst.jpg
exiftool -tagsfromfile src.jpg -all dst.jpg
exiftool -tagsfromfile src.jpg "-all>all" dst.jpg
exiftool -tagsfromfile src.jpg "-all:all>all" dst.jpg

# copy all tags, preserving original group (destination group 'all')
exiftool -tagsfromfile src.jpg -all:all dst.jpg
exiftool -tagsfromfile src.jpg "-all>all:all" dst.jpg
exiftool -tagsfromfile src.jpg "-all:all>all:all" dst.jpg

# copy all tags to EXIF group only (destination group 'exif')
exiftool -tagsfromfile src.jpg "-all>exif:all" dst.jpg
exiftool -tagsfromfile src.jpg "-all:all>exif:all" dst.jpg

# copy XMP tags to XMP group (destination group 'xmp' or 'all')
exiftool -tagsfromfile src.jpg "-xmp:all" dst.jpg
exiftool -tagsfromfile src.jpg "-xmp:all>xmp:all" dst.jpg
exiftool -tagsfromfile src.jpg "-xmp:all>all:all" dst.jpg

# copy XMP tags to preferred groups (no destination group)
exiftool -tagsfromfile src.jpg "-xmp:all>all" dst.jpg

# copy XMP tags to EXIF only (destination group 'exif')
exiftool -tagsfromfile src.jpg "-xmp:all>exif:all" dst.jpg
The same rules illustrated above also apply when copying individual tags.
Note: If no destination group is specified, a new tag is created if necessary only in the preferred group, but if the same tag already exists in another group, then this information is also updated. (Otherwise inconsistent values for the same information would exist in different locations. Of course, you can always generate inconsistencies like this if you really want to by specifically writing contradictory information to different groups.)

10. "How does ExifTool handle coded character sets?"

[Also see FAQ number 18 for help on displaying special characters in a Windows console.]
Certain meta information formats allow coded character sets other than plain ASCII. When reading, 8‑bit encodings are passed straight through ExifTool without re-coding unless specified otherwise below, and multi-byte encodings are converted according to the exiftool -charset option, or to UTF‑8 by default. The -L option is equivalent to "-charset Latin", "-charset Latin1" and "-charset cp1252". When writing, the inverse conversions are performed. Alternatively, special characters may be converted to/from HTML character entities when reading/writing with the -E option.
Valid -charset values are (with aliases given in brackets):
UTF8(cp65001, UTF-8)Thai(cp874)
Latin(cp1252, Latin1)MacRoman(cp10000, Mac, Roman)
Latin2(cp1250)MacLatin2(cp10029)
Cyrillic(cp1251, Russian)     MacCyrillic(cp10007)
Greek(cp1253)MacGreek(cp10006)
Turkish(cp1254)MacTurkish(cp10081)
Hebrew(cp1255)MacRomanian(cp10010)
Arabic(cp1256)MacIceland(cp10079)
Baltic(cp1257)MacCroatian(cp10082)
Vietnam(cp1258)
More specific details are given below about how character coding is handled for EXIF, IPTC, XMP, PNG, ID3, PDF, QuickTime and MIE information:
EXIF: Most textual information in EXIF is stored in ASCII format, and ExifTool does not convert these tags. However it is not uncommon for applications to write UTF‑8 or other encodings where ASCII is expected, and ExifTool will quite happily read/write any encoding without conversion. For a few EXIF tags (UserComment, GPSProcessingMethod and GPSAreaInformation) the stored text may be encoded either in ASCII, Unicode (UCS-2) or JIS. When reading these tags, Unicode and JIS are converted to the character set specified by the -charset or -L option, or to UTF‑8 by default. Other encodings are not converted. When writing, text is stored as ASCII unless the string contains special characters, in which case it is converted from the specified character set and stored as Unicode. ExifTool writes Unicode in native EXIF byte ordering by default, but this may be changed by setting the ExifUnicodeByteOrder tag (see the Extra Tags documentation). The EXIF "XP" tags (XPTitle, XPComment, etc) are always stored as little-endian Unicode, and are read and written using the specified character set.
IPTC: The value of the IPTC:CodedCharacterSet tag determines how the internal IPTC string values are interpreted. If CodedCharacterSet exists and has a value of "UTF8" (or "ESC % G") then string values are assumed to be stored as UTF‑8, otherwise Windows Latin1 (cp1252) coding is assumed by default, but this can be changed with "-charset iptc=CHARSET". When reading, these strings are converted to UTF‑8 by default, or to the character set specified by the -charset or -L option. When writing, the inverse conversions are performed. No conversion is done if the internal (IPTC) and external (ExifTool) character sets are the same. Note that ISO 2022 character set shifting is not supported. Instead, a warning is issued and the string is not converted if an ISO 2022 shift code is found. See the IPTC IIM specification for more information about IPTC character coding.
ExifTool may be used to convert IPTC values to a different internal encoding. To do this, all IPTC tags must be rewritten along with the desired value of CodedCharacterSet. For example, the following command changes the internal IPTC encoding to UTF‑8:
exiftool -tagsfromfile @ -iptc:all -codedcharacterset=utf8 a.jpg
and this command changes it back from UTF‑8 to Windows Latin1 (cp1252):
exiftool -tagsfromfile @ -iptc:all -codedcharacterset= a.jpg
or this command changes it back from UTF‑8 to Windows Latin2 (cp1250):
exiftool -tagsfromfile @ -iptc:all -codedcharacterset= -charset iptc=latin2 a.jpg
But note that unless UTF‑8 is used, applications have no reliable way to determine the IPTC character encoding.
Refers to the older IPTC IIM format. The more recent IPTC Core and Extension specifications actually use the XMP format (see below).
XMP: Exiftool reads XMP encoded as UTF‑8, UTF‑16 or UTF‑32, and converts them all to UTF‑8 internally. Also, all XML character entity references and numeric character references are converted. When writing, ExifTool always encodes XMP as UTF‑8, converting the following 5 characters to XML character references: & < > ' ". By default no further conversion is performed, however the -charset or -L option may be used used to convert text to/from a specified character set when reading/writing.
PNG: PNG TextualData tags are stored as tEXt, zTXt and iTXt chunks in PNG images. The tEXt and zTXt chunks use ISO 8859-1 encoding, while iTXt uses UTF‑8. When reading, ExifTool converts all PNG textual data to the character set specified by the -charset or -L option, or to UTF‑8 by default. When writing, ExifTool generates a tEXt chunk (or zTXt with the -z option) if the text doesn't contain special characters or if Latin encoding is specified (-L or -charset latin); otherwise an iTXt chunk is used and the text is converted from the specified character set and stored as UTF‑8.
ID3: The ID3v1 specification officially supports only ISO 8859‑1 encoding (a subset of Windows Latin1), although some applications may incorrectly use other character sets. By default ExifTool converts ID3v1 text from Latin to the character set specified by the -charset or -L option, or to UTF‑8 by default. However, the internal ID3v1 charset may be specified with "-charset id3=CHARSET". The encoding for ID3v2 information is stored in the file, so ExifTool converts ID3v2 text from this encoding to the character set specified by -charset or -L, or to UTF‑8 by default. ExifTool does not currently write ID3 information.
PDF: PDF text strings are stored in either PDFDocEncoding (similar to Windows Latin1) or Unicode (UCS‑2). When reading, ExifTool converts to the character set specified by the -charset or -L option, or to UTF‑8 by default. When writing, ExifTool encodes input text from the specified character set as Unicode only if the string contains special characters, otherwise PDFDocEncoding is used.
Photoshop: Some Photoshop resource names are stored as Pascal strings with unknown encoding. By default, ExifTool assumes MacRoman encoding and converts this to UTF‑8, but the internal and external character sets may be specified with -charset Photoshop=CHARSET and -charset CHARSET respectively.
QuickTime: QuickTime text strings may be stored in a variety of poorly document formats. ExifTool does its best to decode these according to the -charset option setting.
MIE: MIE strings are stored as either UTF‑8 or ISO 8859‑1. When reading, UTF‑8 strings are converted according to the -charset or -L option, and ISO 8859‑1 strings are never converted. When writing, input strings are converted from the specified character set to UTF‑8. The resulting strings are stored as UTF‑8 if they contain multi-byte UTF‑8 character sequences, otherwise they are stored as ISO 8859‑1.

11. "My user-defined tags don't work"

For examples of how to add user-defined tags, see the ExifTool_config file in the ExifTool distribution. It may be useful to activate this file as a test before trying to implement your own config file. To activate this file, copy it to your HOME directory then rename it to ".ExifTool_config".
Note: The config file must be renamed at the command line because neither the Windows nor Mac GUI allow a file name to begin with a ".". To do this in Windows, run "cmd.exe" and type the following (pressing RETURN at the end of each line):
cd %HOMEPATH%
rename ExifTool_config .ExifTool_config
or on a Mac, open the "Terminal" application (from the /Applications/Utilities folder) and type this command then press RETURN:
mv ExifTool_config .ExifTool_config
With the sample config file installed, you should be able to write the example tags. A command like this:
exiftool -v2 -NewXMPxmpTag=test FILE
should print this as the first line of its output:
Writing XMP-xmp:NewXMPxmpTag
If this doesn't work, the most common problem is that the ".ExifTool_config" configuration file isn't getting loaded. In this case, there are a few things you can try:
  1. Make sure the config file name is correct. It must be ".ExifTool_config" (note the leading ".", and the capital "T").
  2. Set either the HOME or the EXIFTOOL_HOME environment variable to the name of the directory where you put your ".ExifTool_config" file.
  3. Put the config file in the same directory as the exiftool script. (Also, be sure the config filename starts with a dot! See the note above for help renaming the config file.)
  4. If you can't get the config file to load automatically, you can try loading it manually with the exiftool -config CFGFILE option. (Note: This must be the first option on the command line.) This allows loading of a config file with any name.
If necessary, you can verify that ExifTool is loading your config file by adding the following line to your file:
print "LOADED!\n";
If you see a "LOADED!" message when you run exiftool, but your new tags still don't work, make sure you are using the proper tag name and that the file you are writing can support these names.
Programmers: To specify the config file directory from within a Perl script when using the ExifTool API, set the EXIFTOOL_HOME environment variable before loading the ExifTool module:
BEGIN { $ENV{EXIFTOOL_HOME} = '/config_file_directory' }
use Image::ExifTool;
Also see the Configuration section of the ExifTool API documentation for techniques to use a config file with another name, or to disable the config file feature.

12. "How do I export information from exiftool to a database?"

It is often easiest to export information formatted as a tab-delimited list of values. The following exiftool options may be useful for this purpose:
-t  - use a tab instead of spaces to separate output values
-S  - very short format (with -t, prints only tag values)
-q  - quiet (suppresses any other messages)
-f  - force '-' to be printed for non-existent values
-T  - shortcut for the combination of all above options (-t -S -q -f)
-r  - recursively process files in subdirectories
And here is an example command line:
exiftool -T -r -filename -aperture -ISO t/images > out.csv
This command recursively processes all images in the "t/images" directory, extracting FileName, Aperture and ISO tags, and writing the output to a file called "out.txt". After the command has executed, the output file will contain information in the following format:
Canon.jpg       14.0    100
Casio.jpg       2.0     -
Nikon.nef       3.5     200
OlympusE1.jpg   4.5     400
It should be possible to import a file like this directly into most database applications. On the command line, any list of tag names may be used, and any number of file or directory names may be specified. (Hint: If your command line starts to get too long, you may want to look into using the -@ option and/or the ShortCut feature).
In Windows, a .BAT file containing the exiftool command may be used to give drag and drop functionality. Dropping a folder on the following .BAT file will create "out.csv" in the folder:
echo "FileName<tab>Aperture<tab>ISO" > %1\out.csv
exiftool -T -r -filename -aperture -ISO %1 >> %1\out.csv
where "<tab>" in the "echo" command indicates a tab character. This "echo" command was included to add column headings to the output.
Another approach is to export information in RDF/XML format using the -X option, or JSON (JavaScript Object Notation) using the -j option. These methods allow transfer of more complex data sets, but require that the importing software supports these formats.
Finally, the -p option may be used to generate any arbitrary output format. For example, the following format file (let's call it "my.fmt") may be used to give an output similar to the example above but with comma delimiters intead of tabs:
#[HEAD]FileName, Aperture, ISO
$filename, $aperture, $iso
with a command like this:
exiftool -f -r -p my.fmt t/images > out.csv
See the -p option in the application documentation for more information about this feature.

13. "Why is my file smaller after I use ExifTool to write information?"

There are various specific reasons why this can happen, but the general answer is: When ExifTool writes an image, the meta information may be restructured in such a way that it takes less space than in the original file.
For instance, the EXIF/TIFF standard allows for blocks of unreferenced data to exist in an image. Some digital cameras write JPEG or TIFF-based RAW files which contain large blocks of unused data, usually filled with binary zeros. The reason for this could be to simplify camera algorithms by allowing variable-sized information to be written at fixed offsets in the output image. When ExifTool rewrites an image it does not copy these unused blocks. This can result in a significant reduction in file size for some images. [The -htmlDump option may be used to view the file structure if you are interested in seeing these unused data blocks -- use a command like "exiftool -htmlDump a.jpg > out.html", then open the output HTML file with your web browser.]
Also, the size of an XMP record may easily shrink or grow when it is rewritten, even if no meta information is changed. This is partly due to the fact that the XMP specification recommends a few KB of padding at the end of the record (ExifTool adds 2424 bytes by default), and partly due to the flexibility of the XMP format which allows the information to be written in various styles, some of which are more compact than others.
You may also notice that the values of some "offset" tags (like ThumbnailOffset and PreviewImageStart) may change when the file is rewritten. This is normal, and simply indicates that the associated data is now stored at a different position within the file.
ExifTool does not modify the image data itself, so editing a file is "lossless" as far as the image is concerned.

14. "What format do I use for writing GPS coordinates?"

ExifTool is very flexible in the formats allowed for entering GPS coordinates. Any string containing between 1 and 3 floating point numbers is valid. The numbers represent degrees, (and optionally) minutes and seconds.
For EXIF GPS coordinates, the reference direction is specified separately with the EXIF:GPSLatitudeRef or EXIF:GPSLongitudeRef tag.
For XMP GPS coordinates, the reference direction is specified within the XMP:GPSLatitude or XMP:GPSLongitude value, with west longitudes and south latitudes being specified either by negative coordinate values or by ending the string with "W" or "S".
Here are some examples of equivalent ways to specify a GPS latitude in both EXIF and XMP:
exiftool -exif:gpslatitude="42 30 0.00" -exif:gpslatituderef=S a.jpg
exiftool -exif:gpslatitude="42 deg 30.00 min" -exif:gpslatituderef=S a.jpg
exiftool -exif:gpslatitude=42.5 -exif:gpslatituderef=S a.jpg

exiftool -xmp:gpslatitude="42 30 0.00 S" a.jpg
exiftool -xmp:gpslatitude=42.50S a.jpg
exiftool -xmp:gpslatitude=-42.5 a.jpg
Similar styles may be used for longitude. ExifTool will convert any of these coordinate styles to the proper format for the specific tag used.

15. "I get MakerNote warnings or errors when reading or writing information"

Problems like this may be caused by image editing software which doesn't properly update offsets in the MakerNotes when rewriting an image. In many cases, ExifTool will detect this type of problem and issue a warning like this:
Warning: [minor] Possibly incorrect maker notes offsets (fix by -340?)
(Be aware that if multiple warnings occur, the -a option must be used so see them all, since by default only one warning is displayed per file.) If this warning occurs, you can use the -F option to attempt to fix the problem. When writing, -F applies a permanent correction to the maker notes. Note that some Makernote information may be lost permanently if the proper correction is not applied when writing images with this problem.
Any error that occurs while writing will prevent the file from being written. However, most Makernote errors are designated as minor, which allows them to be ignored by using the -m option. For example:
Error: [minor] Bad format (65535) for MakerNotes entry 17
Using -m will downgrade the minor error to a warning, allowing the file to be written, but some Makernote information may be lost when ignoring certain types of errors like this.

16. "Why doesn't ExifTool rename my AVI files?"

By default, ExifTool only processes writable file types when any tag is being written and a directory name is specified on the command line. To force exiftool to process other files, they must either be listed on the command line by name, or be specified using the -ext option, something like this:
exiftool -ext AVI -ext JPG -d pics/%Y/%m "-directory<dateTimeOriginal" DIR
When a single -ext option is used, only files of the specified type are processed. However, multiple -ext options may be used in the same command (as in the example above) to process any number of different file types.
The -listwf option may be used to list all writable file types.
This includes "pseudo" tags like FileName, Directory and FileModifyDate.

17. "List-type tags do not behave as expected"

Tags indicated by a plus sign (+) in the tag name documentation are List-type tags. Two common examples of List-type tags are IPTC:Keywords and XMP:Subject. These tags may have multiple values which are combined into a single string when reading. (By default, extracted values are separated by a comma and a space, but the -sep option may be used to change this.) When writing, separate values are always assigned individually. For example, the following command writes three keywords to all writable files in directory DIR, replacing any previously existing keywords:
exiftool -keywords=one -keywords=two -keywords=three DIR
Values are assigned separately, NOT all together, because this would represent a single keyword:
exiftool -keywords="one, two, three" test.jpg
With exiftool version 7.56 or later, the -sep option may be used to split values of list-type tags into separate items. For example,
exiftool -sep ", " -keywords="one, two, three" DIR
will store three separate keywords, the same as the first example above. This feature may also be used to split a tag value into separate items if it was originally stored incorrectly as a single string:
exiftool -sep ", " -tagsfromfile @ -keywords test.jpg
However, sometimes it is desirable to have list items which contain a comma, and this is allowed:
exiftool -contributor="Harvey, Phil" -contributor="Marley, Bob" a.jpg
But to distinguish these entries when extracting information, a different list separator must be used. For instance, the following command uses "//" to separate list items,
exiftool -contributor -sep "//" a.jpg
and produces an output like this:
Contributor  : Harvey, Phil//Marley, Bob
Note that the above examples overwrite any values which already existed in the original file for these tags. Alternatively, "+=" or "-= may be used to add to or remove from an existing list:
exiftool -keywords+="add this" -keywords-="remove this" DIR
Using "=" is equivalent to "+=" in any command where the same tag is set with "+=" or "-=" in another assignment. (ie. existing values will be preserved unless specifically deleted with "-=".)
To prevent duplication when adding new values, specific values can be deleted then added back again in the same command. For example, the following command adds the keywords "one" and "two", ensuring that they are not duplicated if they already existed in the keywords of an image:
exiftool -keywords-=one -keywords+=one -keywords-=two -keywords+=two DIR
When copying list tags using the -tagsFromFile option, values are copied individually to form proper lists. However, it gets a bit tricky when copying multiple tags to a single list tag: Here, any assignment to a tag overrides earlier assignments to the same tag in the command. For instance, this command
exiftool "-keywords<filename" "-keywords<comment" DIR
writes only the Comment tag. (Note that -tagsFromFile @ is implied by the "<" operation in this command, causing tags to be copied from the original file.) This may seem strange, but it prevents duplicate items from being added to a list when copying a group of tags from a file containing duplicate information. If you really want to add values from multiple tags, use the -addTagsFromFile option instead:
exiftool -addTagsFromFile @ "-keywords<filename" "-keywords<comment" DIR
Note that as with "=" in the first three examples above, the "<" operation of this command overwrites any Keywords that existed previously in the original file. To add to or remove from the existing keywords, use "+<" or "-<".

18. "Special characters don't display properly in my Windows console"

The Windows cmd.exe console uses an MS-DOS encoding by default (cp437 or something similar, depending on your region). The exiftool -charset option may be used to encode the exiftool output for a specific Windows code page, which may help display some special characters, but instead it may be better to switch the console to UTF‑8 (the native ExifTool character encoding). This is especially useful if you are using the -lang option to translate exiftool output to another language. To change the the Windows console to UTF‑8, follow these steps:
  1. Run "cmd.exe" to open a Windows console (select "Run..." from the Start menu and enter "cmd").
  2. Change the font in the console Properties to any True Type font (ie. "TT Lucida Console").
  3. Type "chcp 65001" then press RETURN at the command prompt.
The console should now be able to display UTF‑8 characters (cp65001). But note that the TT Lucida Console font shipped with Windows, at least my version, may not be very complete, and doesn't seem to contain Japanese or Chinese characters.
To permanently set the font, select "Save properties for future windows" when changing the font Properties. Also, you can automatically run "chcp 65001" every time "cmd.exe" is launched by changing the Windows Registry for the Command Processor: Run "regedit" and put "chcp 65001" into Data field for "HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\Autorun". (Unfortunately, I haven't been able to figure out how to change the code page for exiftool when launched via the Windows GUI. If anyone can figure out how to do this, please let me know.)
On some Windows systems, using UTF‑8 doesn't seem to work. In this case, a Windows character set may be the best alternative: For instance, for Windows Latin1 (cp1252) type "chcp 1252" in the console to switch to cp1252, then run exiftool with "-charset cp1252" (or -L). This same technique can be used for other supported Windows code pages.

19. "How do I change the format of an extracted tag value?"

The exiftool application has built-in options which allow you to disable print conversions (-n), escape special HTML characters (-E), and change the date/time (-d) and GPS coordinate (-c) formats, but sometimes more control is needed over the formatting of a value. In this case, user-defined Composite tags may be used to define custom formatting on a per-tag basis. Here is a basic config file example to illustrate the idea:
%Image::ExifTool::UserDefined = (
   'Image::ExifTool::Composite' => {
       MyArtist => {
           Require => 'Artist',
           ValueConv => '$val =~ tr/ /_/; $val',
       },
   },
);
1; # end
The above config file defines a new tag called "MyArtist" which takes its value from the "Artist" tag after converting spaces to underlines. So, for example, an Artist value of "Phil Harvey" yields a corresponding MyArtist value of "Phil_Harvey". The ValueConv string may be any valid Perl expression, and is evaluated to obtain the value for the new tag. In this expression, $val represents the ValueConv value of the Require'd tag.
To activate the config file, it must be named ".ExifTool_config" and placed either in your home directory or in the same directory as the exiftool application. Note that the file name begins with a ".", so if you are in Windows or on a Mac you may need to rename the file from the command line since the GUI might not like file names beginning with a ".".
Often user-defined Composite tags are used to reformat values for writing with a command-line argument like "-DSTTAG<MyArtist" (where DSTTAG is the name of any writable tag, even the original Artist tag or the FileName).
User-defined Composite tags have many other features, including the ability to combine the values of multiple tags. See the config file documentation for more details about user-defined tags, and lib/Image/ExifTool/README in the full distribution for a complete description of ValueConv features. Also, a quick search of the ExifTool forum should reveal a number of user-defined tag examples, and there are other good (and often more complex) examples which can be found in the %Image::ExifTool::Exif::Composite hash of the lib/Image/ExifTool/Exif.pm source code.

20. "ExifTool won't write an image due to errors"

Minor errors may be ignored using the -m option, but sometimes there are more serious errors which can't be ignored. ExifTool can be used to fix these problems in JPEG images by deleting all metadata and rebuilding it from scratch. The command looks like this:
exiftool -all= -tagsfromfile @ -all:all -unsafe bad.jpg
where "bad.jpg" is the name of the image that requires fixing. This command deletes all metadata then copies all writable tags that can be extracted from the original image to the same locations in the new image. The "Unsafe" tag is a shortcut for unsafe EXIF tags in JPEG images which are not normally copied.
After repairing an image like this you should be able to write to it without errors, but note that some metadata from the original image may have been lost in the process.
If there are also MakerNote problems in the file, you may want to add the -F option to the command. See FAQ 15 for details. For example, to rebuild the EXIF only and fix the MakerNote offsets you could do this:
exiftool -exif:all= -tagsfromfile @ -exif:all -unsafe -thumbnailimage -F bad.jpg
Advanced: The byte order of the newly created EXIF is set by the value of the ExifByteOrder tag. Since this tag does not belong to the EXIF group, it is not copied with -exif:all above (but would be copied with -all:all as in the first example). If ExifByteOrder is not set then the byte order is determined by the ordering of the MakerNotes if they are copied, otherwise big-endian ("MM") byte order is used by default. ExifByteOrder may be set to a specific value to force a particular byte order when creating new EXIF (ie. "-ExifByteOrder=II" for little-endian).

21. "How do I read/write values containing newline characters?"

By default, exiftool converts all control characters to "." when extracting information (to avoid messing up the output formatting), so newlines will usually appear as a "." in the output. The -b option may be used to bypass all output formatting (except that a line-feed character is inserted between items in a list), but this may not be appropriate when the values of many tags must be extracted. In this case, the JSON (-j) and XML (-X) options provide alternative output formats which preserve newlines in values.
When writing, there are a number of options:
  1. In many shells, a newline may be inserted directly in the command line:

    Bourne shells (press RETURN inside a quoted string)

    exiftool -comment="line 1
    line 2" image.jpg
    

    C shells (press "\" then RETURN inside a quoted string)

    exiftool -comment="line 1\
    line 2" image.jpg
    
    [Unfortunately the Windows cmd shell provides no method to get a newline (CR/LF in Windows) into the command line. A linefeed (LF) may be inserted with CTRL-T, but I have found no way to insert a carriage return (CR).]

  2. Write the tag from the contents of a separate text file:
    exiftool "-comment<=file.txt" image.jpg
    
  3. Use $/ in a redirection expression (Note: Single quotes must be used in Mac/Linux shells around arguments containing a dollar sign, but double quotes are used instead in Windows):
    exiftool '-comment<line 1$/line 2' image.jpg
    
  4. Use the -E option to allow HTML character entities (Note: In Windows a newline is "&#xd;&#xa;" instead of just "&#xa;"):
    exiftool -E "-comment=line 1&#xa;line 2" image.jpg
    

22. "How do I run exiftool on a file with a name beginning with a dash (-)?"

This is a problem because command-line arguments starting with a dash are interpreted as exiftool options. A work-around is to add the directory name so the argument no longer begins with a dash. For example, to process a file named "-file.jpg" in the current directory, you could do this:
exiftool ./-file.jpg
In Mac/Unix shells, the same problem exists when specifying files using wildcards since these shells automatically expand wildcards into separate command-line arguments. This problem may also be avoided by specifying the directory name as above, but a better solution is to use the -ext option instead of wildcards. For example, use "exiftool -ext jpg ." instead of "exiftool *.jpg" to process all JPEG files in the current directory.

23a. "Why do I get '0 image files updated' when writing?", or
23b. "ExifTool doesn't write some tags to a file"

There are two reasons why this may happen:
  1. The value of the tag is not being set correctly.
This may be due to a tag value which can't be converted, in which case you should warning like this (note: you may need to use the -v3 option to see the warning if other same-named tags are being set properly by the same assignment):
Warning: Can't convert IFD0:Orientation (not in PrintConv)
You get this warning if you write an invalid value to a tag which accepts only specific values. See the "Values" column in the appropriate table of the Tag Name documentation for a list of valid values for these types of tags. The value conversion may also be bypassed with the -n option, allowing numerical values to be written directly.
  1. The information type isn't supported by the format of the target file.
Warnings are NOT generated when a tag isn't written because it is normal that many tags can't be written when copying between files of different formats.
Tags are not written if the format of the target file doesn't support the specific type of meta information. For example, CRW images do not support EXIF or IPTC metdata. Follow the links in the Supported File Types table for an indication of the tags supported by your file. If the tags aren't supported for your file type, then a metadata sidecar file is an alternative.
Also note that MakerNotes tags can not be created or deleted individually, so they can only be written if they already exist in a file.

Last revised Nov. 10, 2010

<-- Back to ExifTool home page