Given a directory of font files (TTF and OTF) I'd like to inspect each font and determine what style (regular, italic, bold, bold-italic) it is. Is there a command line tool for unix flavored operating systems that can do this? Or does anyone know how to extract the metadata from a TTF or OTF font file?

2 Answers 2


I think you're looking for otfinfo. There doesn't seem to be an option to get at the Subfamily directly, but you could do:

otfinfo --info *.ttf | grep Subfamily

Note that a number of the fonts I looked at use "Oblique" instead of "Italic".

  • 12
    Perfect, thanks! For those interested I'm on OS X and installed it via brew with brew install lcdf-typetools
    – kreek
    Dec 5, 2011 at 5:28
  • FWIW, the MacPorts package is also called lcdf-typetools (and is a dependency of texlive-fontutils, so it may already be installed for people using TeX).
    – hans_meine
    Mar 4, 2019 at 6:54

In Linux, if you have .ttf fonts, you most probably also have fontconfig, which comes with the fc-scan utility. You can parse the output for the information you want, or use the badly documented --format option.

For example:

fc-scan --format "%{foundry} : %{family}\n" /usr/share/fonts/truetype/msttcorefonts/arialbd.ttf

The font properties you can print this way are shown here: http://www.freedesktop.org/software/fontconfig/fontconfig-user.html#AEN21

Some properties are listed in multiple languages. For example, %{fullname} may be a list. In that case, %{fullnamelang} will list the languages. If that shows you your language in fourth position in the list, you can use %{fullname[3]} as the format string to print the full name in only that language.

This language stuff being quite inconvenient, I ended up writing a full Perl script to list the info I wanted in only one language:


use strict;
my $VERSION=0.1;
my $debug=1;

my @wanted  = qw(foundry family fullname style weight slant width spacing file);
my @lang_dependent = qw(family fullname style);
my $lang = "en";

my $separator = ", ";

use File::Basename;
use Data::Dumper; $Data::Dumper::Sortkeys = 1;

my $me = basename $0;
die "Usage: $me FILENAME\n" unless @ARGV;

my $fontfile = shift;

unless (-f $fontfile) {
    die "Bad argument: '$fontfile' is not a file !\n";

my $fc_format = join( "\\n", map { "\%{$_}" } @wanted );

my @info = `fc-scan --format "$fc_format" "$fontfile"`;
chomp @info;

my %fontinfo;
@fontinfo{@wanted} = @info;

if ( grep /,/, @fontinfo{ @lang_dependent } ) {
    my $format = join( "\\n", map { "\%{${_}lang}" } @lang_dependent );
    my @langs = `fc-scan --format "$format" "$fontfile"`;

    for my $i (0..$#lang_dependent) {
        my @lang_list = split /,/, $langs[$i];
        my ($pos) = grep { $lang_list[$_] ~~ $lang } 0 .. $#lang_list;
        my @vals = split /,/, $fontinfo{$lang_dependent[$i]};
        $fontinfo{$lang_dependent[$i]} = $vals[$pos];

warn Dumper(\%fontinfo), "\n" if $debug;

$fontinfo{'fullname'} ||= $fontinfo{'family'}; # some old fonts don't have a fullname? (WINNT/Fonts/marlett.ttf)

print join($separator, @fontinfo{@wanted}), "\n";
  • Awesome, thanks for the tip (and script.. though I haven't tested the script yet). Do you know if there's a way to get license/copyright info as well? I tried %{license}, %{copyright} and no format, but none of those yielded anything, whereas fontforge is able to show it to me.
    – insaner
    Nov 25, 2015 at 16:23
  • 1
    Indeed, fc-scan does't seem to show the copyright. foundry is the closest it gives you. But otfinfo -i, suggested by cjm, does display it.
    – mivk
    Nov 25, 2015 at 23:54
  • Ah that's great, I installed lcdf-typetools and and ran otfinfo -i as suggested and that did the trick, thanks! (And I gave @cjm a +1 as well).
    – insaner
    Nov 26, 2015 at 15:05
  • 1
    fc-scan is great for getting the font "fullname" that is used to reference the font in programs.
    – mpr
    Apr 9, 2018 at 14:52
  • 1
    If you want to avoid the language issue, postscriptname instead of fullname gives you the same information, language-independent, in a different format. Alternatively, in bash: for fontfile in /mnt/Fonts/*.{otf,ttf}; do fc-scan --format "%{fullname[$(( $(sed -E 's/^(.*)en.*/\1/;s/[^,]//g' <<< "$(fc-scan --format "%{fullnamelang}\n" ${fontfile})" | wc -c) -1 ))]}\n" "${fontfile}"; done > fontlist.txt
    – emk2203
    May 7, 2020 at 6:55

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.