Determine the MIME type of a file

Download the plain text (non-html) version of this script.


:
##########################################################################
# Title      :	getmimetype - determine MIME type of file
# Author     :	Heiner Steven 
# Date       :	1999-08-24
# Requires   :	[ngm]awk
# Category   :	Mail
# SCCS-Id.   :	@(#) getmimetype	1.8 18/05/14
##########################################################################
# Description
#
##########################################################################

PN=`basename "$0"`			# Program name
VER='1.8'

: ${LOCALLIB:=/usr/local/lib}

# We need a new version of AWK, i.e. "nawk" or "gawk"
awk='gawk'
for path in `echo "$PATH" | sed 's/^:/.:/;s/:$/:./;s/:/ /g'`
do
    for p in mawk gawk nawk
    do
    	[ -x "$path/$p" ] || continue
	awk=$path/$p; break 2
    done
done
: ${NAWK:=${awk:=awk}}

Usage () {
    echo >&2 "$PN - determine MIME type of file, $VER
usage: $PN file [file ...]

Reads the files
	$LOCALLIB/mimetypes
	$HOME/.mimetypes"
    exit 1
}

Msg () {
    for MsgLine
    do echo "$PN: $MsgLine" >&2
    done
}

Fatal () { Msg "$@"; exit 1; }

set -- `getopt h "$@"`
[ $# -lt 1 ] && Usage			# "getopt" detected an error

while [ $# -gt 0 ]
do
    case "$1" in
	--)	shift; break;;
	-h)	Usage;;
	-*)	Usage;;
	*)	break;;			# First file name
    esac
    shift
done

MimeTypes=${TMPDIR:=/tmp}/pmt$$
trap 'rm -f "$MimeTypes" >/dev/null 2>&1' 0
trap "exit 2" 1 2 3 15

> "$MimeTypes"
for file in $LOCALLIB/mimetypes $HOME/.mimetypes
do
    if [ -r "$file" ]
    then
    	cat "$file" >> "$MimeTypes"
    fi
done

# Define some MIME type defaults
cat <<-EOT >> "$MimeTypes"
	# MIME type		File Extensions
	text/plain		.*\.[tT][eE][xX][tT]$ .*\.[tT][xX][tT]$
	text/html		.*\.[hH][tT][mM]$ .*\.[hH][tT][mM][lL]$
	text/calendar		.*\.[iI][cC][sS]$

	image/jpeg		.*\.[jJ][pP][eE][gG]$ .*\.[jJ][pP][gG]$
	image/gif		.*\.[gG][iI][fF]$
	image/png		.*\.[pP][nN][gG]$

	video/mpeg		.*\.[mM][pP][eE][gG]$ .*\.[mM][pP][gG]$
	video/avi		.*\.[aA][vV][iI]$

	application/postscript	.*\.[pP][sS]$
	application/pdf		.*\.[pP][dD][fF]$

	audio/basic		.*\.[aA][uU]$
	audio/wav		.*\.[wW][aA][vV]$
	audio/mp3		.*\.[mM][pP]3$
	EOT

for file
do
    [ -f "$file" ] || continue
    if file "$file" | grep -i text >/dev/null
    then defaulttype=text/plain
    else defaulttype=application/octet-stream
    fi
    echo "$defaulttype	$file"
done |
    $NAWK '
    	BEGIN {
	    # Read the MIME type table
	    mimetypes = "'"$MimeTypes"'"
	    while ( getline < mimetypes ) {
	    	if ( $1 ~ /^\#/ ) continue		# ignore comments
		if ( $0 ~ /^[ 	]*$/ ) continue	# ignore empty lines

		if ( (k = split ($0, f)) > 1 ) {
		    mimetype = f [1]
		    for ( i=2; i<=k; i++ ) typeOf [$i] = mimetype
		}
	    }
	    close (mimetypes)
	    #for ( i in typeOf ) print ">" i "<", typeOf [i]
	}
	{
	    mimetype = ""
	    for ( t in typeOf )  {
	    	if ( $0 ~ t ) {
		    mimetype = typeOf [t]
		    break
		}
	    }
	    if ( mimetype == "" ) mimetype = $1
	    print mimetype
	}
    '