How to use find command to search for multiple extensions

Use the -o flag between different parameters.

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) works like a charm.

NOTE There must be a space between the bracket and its contents or it won't work.

Explanation:

  • -type f - only search for files (not directories)
  • \( & \) - are needed for the -type f to apply to all arguments
  • -o - logical OR operator
  • -iname - like -name, but the match is case insensitive

You can combine criteria with -o as suggested by Shadur. Note that -o has lower precedence than juxtaposition, so you may need parentheses.

find . -name '*.jpg' -o -name '*.png'
find . -mtime -7 \( '*.jpg' -o -name '*.png' \)  # all .jpg or .png images modified in the past week

On Linux, you can use -regex to combine extensions in a terser way. The default regexp syntax is Emacs (basic regexps plus a few extensions such as \| for alternation); there's an option to switch to extended regexps.

find -regex '.*\.\(jpg\|png\)'
find -regextype posix-extended -regex '.*\.(jpg|png)'

On FreeBSD, NetBSD and OSX, you can use -regex combined with -E for extended regexps.

find -E . -regex '.*\.(jpg|png)'

This is more correct:

find . -iregex '.*\.\(jpg\|gif\|png\|jpeg\)$'