How to Install Exiftool on Ubuntu 26.04, 24.04 and 22.04

Install ExifTool on Ubuntu 26.04, 24.04, and 22.04 with the maintained APT package for routine metadata work, or keep a newer upstream archive separate as exiftool-latest when file-format support requires it.

PublishedAuthorJoshua JamesRead time7 minGuide typeUbuntu

Metadata work gets easier when one terminal command can inspect camera tags, PDF fields, sidecar files, media timestamps, and privacy-sensitive location data. To install ExifTool on Ubuntu, use the Ubuntu package libimage-exiftool-perl for routine work, then add the separate upstream archive only when you need a newer ExifTool release than your Ubuntu version currently ships.

The Ubuntu APT package provides the normal exiftool command. The upstream archive path in this article creates exiftool-latest under your user account, so it does not replace Ubuntu’s package-managed /usr/bin/exiftool. The commands apply to Ubuntu 26.04, 24.04, and 22.04.

Install ExifTool on Ubuntu

Choose the package source first. Both install paths can coexist because they use different command names, but most systems should start with the Ubuntu package and add exiftool-latest only for newer upstream metadata support.

Choose an ExifTool Install Method

MethodSourceCommandUpdate behaviorBest for
Ubuntu APT packageUbuntu Universe package libimage-exiftool-perlexiftoolAPT upgrades with your Ubuntu releaseMost users who want predictable system maintenance
Manual upstream archiveOfficial ExifTool archive and checksum fileexiftool-latestManual rerun when upstream publishes a newer releaseUsers who need newer tag or file-format support without changing system files
Optional update helperSame official upstream archive path as the manual methodupdate-exiftool-latestRepeats the archive check, checksum verification, replacement, and no-op detectionUsers who expect to refresh the upstream archive more than once

Current Ubuntu package metadata lists ExifTool 13.50 on Ubuntu 26.04, 12.76 on Ubuntu 24.04, and 12.40 on Ubuntu 22.04. Upstream can be newer than the archive package; run exiftool -ver or exiftool-latest -ver after installation to confirm the active command.

These commands use sudo for package-manager steps that change system packages. Review the LinuxCapable sudo command examples if your account cannot run administrator commands yet.

Install ExifTool with APT

Refresh package metadata, then install the Ubuntu package. APT places the command at /usr/bin/exiftool and tracks it with the rest of your Ubuntu packages.

sudo apt update
sudo apt install libimage-exiftool-perl

Verify the version, command path, and package owner after the install finishes.

exiftool -ver
command -v exiftool
dpkg -S "$(command -v exiftool)"

Relevant output from a successful APT install includes the package-managed path and owner:

/usr/bin/exiftool
libimage-exiftool-perl: /usr/bin/exiftool

Install Latest ExifTool Manually from the Upstream Archive

Use the upstream archive method when the Ubuntu package is too old for a tag, file type, or ExifTool fix you need. This method uses the official ExifTool site, the project-published SourceForge archive path, and the official checksum file before replacing the user-local install directory.

The manual archive method replaces only ~/.local/opt/exiftool-latest and ~/.local/bin/exiftool-latest. Back up those paths first if you already use them for a custom ExifTool install.

Install the download prerequisites if they are missing. Ubuntu normally includes the archive tools, but wget and CA certificates are the pieces this path depends on directly.

The archive workflow uses wget for upstream downloads. The LinuxCapable wget command examples are useful if you want to review output redirection and quiet download flags before adapting the commands.

sudo apt update
sudo apt install wget ca-certificates

Create a temporary working directory, download the current upstream archive, and verify it against ExifTool’s published SHA-256 checksum.

workdir="$(mktemp -d)"
cd "$workdir"

version="$(wget -qO- https://exiftool.org/ver.txt | tr -d '[:space:]')"
archive="Image-ExifTool-${version}.tar.gz"

wget -O "$archive" "https://downloads.sourceforge.net/project/exiftool/${archive}"

expected_sha256="$(wget -qO- https://exiftool.org/checksums.txt | grep -o "SHA2-256(${archive})= [0-9a-f]*" | awk '{print $2}')"
if [ -z "$expected_sha256" ]; then
  echo "Checksum not found for $archive" >&2
  exit 1
fi

printf '%s  %s\n' "$expected_sha256" "$archive" | sha256sum -c -

Example output from a verified archive looks like this. The version changes when upstream publishes a newer release.

Image-ExifTool-13.59.tar.gz: OK

Extract the verified archive, move it into a stable user-local directory, and create the exiftool-latest wrapper. The wrapper runs the extracted ExifTool script in place so the bundled lib directory stays next to it.

install_dir="$HOME/.local/opt/exiftool-latest"
wrapper="$HOME/.local/bin/exiftool-latest"

gzip -dc "$archive" | tar -xf -
mkdir -p "$(dirname "$install_dir")" "$(dirname "$wrapper")"

rm -rf -- "$install_dir"
mv "Image-ExifTool-${version}" "$install_dir"

cat > "$wrapper" <<'WRAPPER'
#!/bin/sh
exec "$HOME/.local/opt/exiftool-latest/exiftool" "$@"
WRAPPER

chmod +x "$wrapper"

Add ~/.local/bin to your current shell path if the directory was created during this session, then verify the wrapper.

export PATH="$HOME/.local/bin:$PATH"
command -v exiftool-latest
exiftool-latest -ver

Example output should show a path under your home directory and the upstream version. The username portion of the path will differ on your system.

/home/joshua/.local/bin/exiftool-latest
13.59

Remove the temporary download directory after the wrapper works.

cd "$HOME"
if [ -n "${workdir:-}" ] && [ -d "$workdir" ]; then
  rm -rf -- "$workdir"
fi

Create an Optional Upstream Update Helper

The helper in this section is not a separate package source. It automates the same official archive download, checksum check, extraction, wrapper creation, and no-op detection used by the manual method. Keep the manual commands above when you want to see each phase; use the helper when you expect to refresh exiftool-latest repeatedly.

mkdir -p "$HOME/.local/bin"

cat > "$HOME/.local/bin/update-exiftool-latest" <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

install_dir="$HOME/.local/opt/exiftool-latest"
bin_dir="$HOME/.local/bin"
wrapper="$bin_dir/exiftool-latest"
base_url="https://exiftool.org"
download_base="https://downloads.sourceforge.net/project/exiftool"

require_command() {
  local name="$1"
  if ! command -v "$name" >/dev/null 2>&1; then
    printf 'Missing required command: %s\n' "$name" >&2
    exit 1
  fi
}

for name in wget gzip tar sha256sum awk grep mktemp; do
  require_command "$name"
done

latest="$(wget -qO- "$base_url/ver.txt" | tr -d '[:space:]')"
if [[ -z "$latest" || ! "$latest" =~ ^[0-9]+([.][0-9]+)+$ ]]; then
  printf 'Could not parse the latest ExifTool version.\n' >&2
  exit 1
fi

current="not installed"
if [[ -x "$wrapper" ]]; then
  current="$($wrapper -ver 2>/dev/null || printf 'broken')"
elif command -v exiftool-latest >/dev/null 2>&1; then
  current="$(exiftool-latest -ver 2>/dev/null || printf 'broken')"
fi

printf 'Latest ExifTool version: %s\n' "$latest"
printf 'Current exiftool-latest version: %s\n' "$current"

if [[ "$current" == "$latest" && -x "$wrapper" && -x "$install_dir/exiftool" ]]; then
  printf 'exiftool-latest is already current.\n'
  printf 'Command path: %s\n' "$wrapper"
  exit 0
fi

tmp_dir=""
cleanup() {
  if [[ -n "${tmp_dir:-}" ]]; then
    rm -rf -- "$tmp_dir"
  fi
}
trap cleanup EXIT

tmp_dir="$(mktemp -d)"
archive="Image-ExifTool-${latest}.tar.gz"
archive_path="$tmp_dir/$archive"

wget -qO "$archive_path" "$download_base/$archive"
expected_sha256="$(wget -qO- "$base_url/checksums.txt" | grep -o "SHA2-256(${archive})= [0-9a-f]*" | awk '{print $2}')"
if [[ -z "$expected_sha256" ]]; then
  printf 'Checksum not found for %s\n' "$archive" >&2
  exit 1
fi

(
  cd "$tmp_dir"
  printf '%s  %s\n' "$expected_sha256" "$archive" | sha256sum -c -
)

gzip -dc "$archive_path" | tar -C "$tmp_dir" -xf -
staging_dir="$tmp_dir/Image-ExifTool-$latest"
if [[ ! -x "$staging_dir/exiftool" || ! -d "$staging_dir/lib" ]]; then
  printf 'The extracted ExifTool archive did not contain the expected files.\n' >&2
  exit 1
fi

mkdir -p "$(dirname "$install_dir")" "$bin_dir"
rm -rf -- "$install_dir"
mv "$staging_dir" "$install_dir"

cat > "$wrapper" <<'WRAPPER'
#!/bin/sh
exec "$HOME/.local/opt/exiftool-latest/exiftool" "$@"
WRAPPER
chmod +x "$wrapper"

printf 'Installed exiftool-latest %s\n' "$($wrapper -ver)"
printf 'Command path: %s\n' "$wrapper"
EOF

chmod +x "$HOME/.local/bin/update-exiftool-latest"
export PATH="$HOME/.local/bin:$PATH"
command -v update-exiftool-latest

The command discovery check should print the helper path under ~/.local/bin. Run the helper to install or update the upstream archive:

update-exiftool-latest

Example first-run output includes the version check, checksum result, installed version, and command path:

Latest ExifTool version: 13.59
Current exiftool-latest version: not installed
Image-ExifTool-13.59.tar.gz: OK
Installed exiftool-latest 13.59
Command path: /home/joshua/.local/bin/exiftool-latest

Run the helper again later to check for an upstream update. A current install exits without replacing files:

update-exiftool-latest
Latest ExifTool version: 13.59
Current exiftool-latest version: 13.59
exiftool-latest is already current.
Command path: /home/joshua/.local/bin/exiftool-latest

Check ExifTool Metadata Output

The examples in this section use exiftool. Replace it with exiftool-latest when you want to test the upstream archive install instead of the Ubuntu package.

Read Basic File Metadata

Start with a harmless system text file so you can confirm ExifTool works before pointing it at photos, documents, or media files.

exiftool -FileName -Directory -MIMEType /etc/os-release
File Name                       : os-release
Directory                       : /etc
MIME Type                       : text/plain

Export Selected Metadata as JSON

Use JSON output when you want to hand metadata to a script, compare records, or store a small audit file.

exiftool -j -FileName -Directory -MIMEType /etc/os-release > metadata.json
cat metadata.json
[{
  "SourceFile": "/etc/os-release",
  "FileName": "os-release",
  "Directory": "/etc",
  "MIMEType": "text/plain"
}]

Create and Inspect an XMP Sidecar

This example creates a small XMP sidecar file from /etc/os-release, then reads back the fields you set. It is safer than practicing on original photos because it creates a new file in your current directory.

exiftool -XMP-dc:Creator="Your Name" -XMP-dc:Description="Metadata note" -o example.xmp /etc/os-release
exiftool -Creator -Description example.xmp
Creator                         : Your Name
Description                     : Metadata note

Remove Metadata from a Copy

Practice metadata removal on a copy first. This workflow keeps the original example.xmp and removes metadata from cleaned-example.xmp.

cp example.xmp cleaned-example.xmp
exiftool -overwrite_original -all= cleaned-example.xmp

For photos or documents, review the cleaned file before replacing the original. Metadata can include useful camera, rights, timestamp, geolocation, and workflow fields, not just private information.

Remove the practice files when you no longer need them.

rm -f -- metadata.json example.xmp cleaned-example.xmp

Update ExifTool on Ubuntu

Update the APT Package

For the Ubuntu package, refresh package metadata and ask APT to upgrade only libimage-exiftool-perl if your release has a newer build available.

sudo apt update
sudo apt install --only-upgrade libimage-exiftool-perl

Relevant output on a current Ubuntu 26.04 system looks like this:

libimage-exiftool-perl is already the newest version (13.50+dfsg-1).
0 upgraded, 0 newly installed, 0 to remove and 5 not upgraded.

The exact version and upgrade counts can differ by release and enabled repositories. The important signal is that APT handles the package and either upgrades it or reports it is already current for your Ubuntu sources.

Check the Manual Archive Version

For the manual archive method, compare the installed wrapper version with the latest upstream version. If they differ, rerun the manual download, checksum, extraction, and wrapper commands from the archive section.

latest="$(wget -qO- https://exiftool.org/ver.txt | tr -d '[:space:]')"
installed="$(exiftool-latest -ver)"
printf 'latest=%s installed=%s\n' "$latest" "$installed"
latest=13.59 installed=13.59

This is the manual update check for the archive install. Matching values mean your exiftool-latest wrapper already runs the newest upstream release available from ExifTool’s version file.

Update with the Helper Script

If you created update-exiftool-latest, run that command instead of repeating the manual archive blocks. The helper checks the upstream version, verifies the checksum, replaces the user-local archive only when needed, and reports the no-op state when you are already current.

update-exiftool-latest
Latest ExifTool version: 13.59
Current exiftool-latest version: 13.59
exiftool-latest is already current.
Command path: /home/joshua/.local/bin/exiftool-latest

Remove ExifTool from Ubuntu

Remove the APT Package

Remove the Ubuntu package when you no longer need the package-managed exiftool command.

sudo apt remove libimage-exiftool-perl

Confirm the command and package are gone from the installed package set.

hash -r
command -v exiftool || echo "exiftool removed"
dpkg -l libimage-exiftool-perl 2>/dev/null | grep '^ii' || echo "APT package removed"
exiftool removed
APT package removed

APT may report dependencies that are no longer required. Review the package list before accepting an autoremove cleanup, especially on reused workstations.

sudo apt autoremove

Remove the User-Local Archive Install

This removes the user-local upstream archive, wrapper, and optional updater helper. It does not remove the Ubuntu APT package, and it permanently deletes those local ExifTool helper paths for your account.

rm -rf -- "$HOME/.local/opt/exiftool-latest" "$HOME/.local/bin/exiftool-latest" "$HOME/.local/bin/update-exiftool-latest"
hash -r
command -v exiftool-latest || echo "exiftool-latest removed"
command -v update-exiftool-latest || echo "update-exiftool-latest removed"
exiftool-latest removed
update-exiftool-latest removed

Troubleshoot ExifTool on Ubuntu

Fix exiftool: command not found

The APT method provides exiftool; the upstream archive method provides exiftool-latest. Check both command names before reinstalling anything.

for cmd in exiftool exiftool-latest update-exiftool-latest; do
  if command -v "$cmd" >/dev/null 2>&1; then
    printf '%s -> %s\n' "$cmd" "$(command -v "$cmd")"
  else
    printf '%s -> not found\n' "$cmd"
  fi
done
exiftool -> /usr/bin/exiftool
exiftool-latest -> /home/joshua/.local/bin/exiftool-latest
update-exiftool-latest -> /home/joshua/.local/bin/update-exiftool-latest

If exiftool-latest exists under ~/.local/bin but your current shell cannot find it, add that directory to the current shell path and retry the version check.

export PATH="$HOME/.local/bin:$PATH"
exiftool-latest -ver

Fix APT Unable to Locate the Package

libimage-exiftool-perl is in Ubuntu’s Universe component. Check the package candidate first; a missing candidate usually means Universe is disabled or package metadata is stale.

apt-cache policy libimage-exiftool-perl

Relevant output should include a candidate version, such as the Ubuntu 26.04 package shown here:

libimage-exiftool-perl:
  Installed: (none)
  Candidate: 13.50+dfsg-1
  Version table:
     13.50+dfsg-1 500
        500 http://archive.ubuntu.com/ubuntu resolute/universe amd64 Packages

If the candidate is (none), enable Universe, refresh package metadata, and recheck the package candidate before installing.

sudo apt install software-properties-common
sudo add-apt-repository --yes universe
sudo apt update
apt-cache policy libimage-exiftool-perl

Fix a Failed Upstream Checksum

Stop when checksum verification fails. A mismatch means the downloaded archive does not match the checksum ExifTool publishes for that version, or the script resolved mismatched version and checksum data.

version="$(wget -qO- https://exiftool.org/ver.txt | tr -d '[:space:]')"
archive="Image-ExifTool-${version}.tar.gz"
wget -qO- https://exiftool.org/checksums.txt | grep -F "SHA2-256(${archive})="
SHA2-256(Image-ExifTool-13.59.tar.gz)= 668ea3acececb7235fbd0f4900e72d5f12c9b07e5c778fd36cb1e9b5828fd65a

Remove the failed working directory and rerun the download. Do not extract or install the archive until sha256sum -c - reports OK.

cd "$HOME"
if [ -n "${workdir:-}" ] && [ -d "$workdir" ]; then
  rm -rf -- "$workdir"
fi

Fix a Broken exiftool-latest Wrapper

If exiftool-latest exists but fails to run, check both the wrapper and the extracted upstream script. Both should be executable.

test -x "$HOME/.local/bin/exiftool-latest" && echo "wrapper executable"
test -x "$HOME/.local/opt/exiftool-latest/exiftool" && echo "upstream script executable"
wrapper executable
upstream script executable

If either line is missing, rerun the manual archive install or run update-exiftool-latest after confirming the helper exists. Retest with exiftool-latest -ver.

Use Upstream When the APT Version Is Too Old

Ubuntu LTS releases prioritize stable package branches over every upstream ExifTool release. If a tag, file type, or metadata fix requires a newer upstream release, use exiftool-latest for that task and keep the APT package for normal system-managed use.

Conclusion

ExifTool is ready on Ubuntu when exiftool -ver reports the Ubuntu package version or exiftool-latest -ver reports the upstream archive version. Keep APT as the default maintenance path, and use the separate upstream wrapper or helper only when newer metadata support is worth the extra manual ownership.

Share this guide

Help another Linux user troubleshoot faster

Share this guide with someone troubleshooting Linux systems or saving it for later.

Follow LinuxCapable

Want more LinuxCapable guides in Google?

Add LinuxCapable as a preferred source so Google can show our tutorials more often in Top Stories and mark them as preferred in AI Mode and AI Overviews when relevant.

Add LinuxCapable as a preferred source on Google
Search LinuxCapable

Need another guide?

Search LinuxCapable for package installs, commands, troubleshooting, and follow-up guides related to what you just read.

Found this guide useful?

Support LinuxCapable to keep tutorials free and up to date.

Buy me a coffeeBuy me a coffee
Before commenting, please review our Comments Policy.
Formatting tips for your comment

You can use basic HTML to format your comment. Useful tags currently allowed in published comments:

You type Result
<code>command</code> command
<strong>bold</strong> bold
<em>italic</em> italic
<a href="https://example.com">link</a> link
<blockquote>quote</blockquote> quote block

Add to the discussion

Questions, fixes, command output, and version notes help keep this guide current.

Verify before posting: