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\)$'