exiftool: delete exif data but preserve some specific tags

Currently I use exiftool with the -all= option and it deletes all the EXIF data from my photos:

exiftool -overwrite_original -all= /Users/andyl/photos/*.jpg

Now I want exiftool to delete all the EXIF information but NOT the photo's title, caption and keywords.

How I can achieve this?


Solution 1:

You should always check the man pages if you are in trouble.

man exiftools

Which should read something like this:

--TAG

    Exclude specified tag from extracted information.  Same as the -x
    option.  May also be used following a -tagsFromFile option to
      exclude tags from being copied, or to exclude groups from being
    deleted when deleting all information (ie. "-all= --exif:all"
    deletes all but EXIF information).  But note that this will not
    exclude individual tags from a group delete.  Instead, individual
    tags may be recovered using the -tagsFromFile option (ie. "-all=
    -tagsfromfile @ -artist").  Wildcards are permitted as described
    above for -TAG.

Something like:

exiftool -overwrite_original -all= -tagsFromFile @ -title -caption -keywords /Users/andyl/photos/*.jpg

should work. Ensure that the tags really are named this way using exif /path/to/file.jpg.

What the command does? -all= deletes all the tags, -tagsFromFile @ takes the listed flags from the source file, in this case @ represents the current file, (you could of course substitute with a fixed file here like -tagsFromFile pic.jpg) and writes them to the destination.

Solution 2:

If you only want to delete certain tags from the original file (i.e. no transfer from tags between files, but from within the same file), you do not need the -tagsFromFile switch, but a < to tell to transfer them along the file.

Note: As of now (version 10.79) -common<common cannot set composite tags and therefore using -common to transfer tags will break things, e.g. tranferring Flash to Model. Therefore, my code is explicit and includes every tag that -common would normally include. Seems to be a good idea, anyway.

exiftool -All:All= \
         -DateTimeOriginal<DateTimeOriginal \
         -Model<Model \
         -LensModel<LensModel \
         -FocalLength<FocalLength \
         -ISO<ISO \
         -ExposureTime<ExposureTime -ShutterSpeedValue<ShutterSpeedValue -BulbDuration<BulbDuration \
         -ApertureValue<ApertureValue -FNumber<FNumber \
         -WhiteBalance<WhiteBalance \
         -Flash<Flash \
         test.jpg
  # Or, if you want to use `-TagsFromFile`:
exiftool -All:All= \
         -TagsFromFile test.jpg \
         -DateTimeOriginal \
         -Model \
         -LensModel \
         -FocalLength \
         -ISO \
         -ExposureTime -ShutterSpeedValue -BulbDuration \
         -ApertureValue -FNumber \
         -WhiteBalance \
         -Flash \
         test.jpg

Please also note that my code contradicts the exiftool application documentation, which includes samples that I simply could not get to work with this task at hand (and version 10.79).