How to use find command to search for multiple extensions

I can get all jpg images by using:

find . -name "*.jpg"  

But how can I add png files to the results as well?

Asked By: wong2

||

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
Answered By: Shadur

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 ( -name '*.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)$'
Answered By: Dimitry

To make it clear, the only option that works on Linux, Unix and macOS flavour is:

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

That’s because the OS X version is a little bit different, but that’s important to write things that go well on most platforms.

Answered By: sorin

If only files are needed:

find ./ -type f -regex '.*.(jpg|png)$'

For example, this will not match a directory named "blah.jpg".

Answered By: nvd
Categories: Answers Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.