0

How can I test whether a variable has a valid video file extension (.mp4) ?

Vera
  • 1,223

1 Answers1

3

Using a shell pattern comparison in e.g. bash:

if [[ $variable == *.mp4 ]]; then
    printf 'String "%s" ends in ".mp4"\n' "$variable"
else
    printf 'String "%s" has some other suffix\n' "$variable"
fi

or, using a standard case statement, which may be prettier if you want to compare many suffix strings,

case $variable in
    *.mp4)
        printf 'String "%s" ends in ".mp4"\n' "$variable"
        ;;
    *.mov)
        printf 'String "%s" ends in ".mov"\n' "$variable"
        ;;
    *.blarg|*.foo)
        printf 'String "%s" ends in ".blarg" or ".foo"\n' "$variable"
        ;;
*)
    printf 'String "%s" has some other suffix\n' "$variable"

esac

If your variable contains a pathname and you want to test whether the file at that pathname is a file in a video format, it would (possibly) be better to ask the file command to classify the file's contents. This is because files on Unix systems are arbitrary, and a directory may be called my video.mp4 even though it's clearly not a video file.

You can get the MIME-type of a file using file -i (here, I'm also using file with its -b option for "brief" output, without the filename):

$ file -b -i 'video/the_amazing_spiderman_trailer.mp4'
video/mp4; charset=binary

This could be used in a script:

if file -b -i "$variable" | grep -q -F 'video/mp4;'
then
    printf '"%s" is most likely an MP4 video\n' "$variable"
fi

In the code above, it does not matter what suffix string $variable contains.

Note that I'm testing this on a FreeBSD system and that the output of file is not standard. You need to test on your local machine. Also note that the file command on macOS uses -I in place of -i.

A somewhat related question with more info about file in my answer to it:

Kusalananda
  • 333,661