I can get all jpg images by using:
find . -name "*.jpg"
But how can I add png files to the results as well?
I can get all jpg images by using:
find . -name "*.jpg"
But how can I add png files to the results as well?
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 insensitiveYou 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)'
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.
If only files are needed:
find ./ -type f -regex '.*\.\(jpg\|png\)$'
For example, this will not match a directory named "blah.jpg".