Find files filtered by multiple extensions
Solution 1
You can combine different search expressions with the logical operators -or
or -and
, so your case can be written as
find . -type f \( -name "*.shtml" -or -name "*.css" \)
This also show that you do not need to escape special shell characters when you use quotes.
Edit
Since -or
has lower precedence than the implied -and
between -type
and the first -name
put name part into parentheses as suggested by Chris.
Solution 2
Here is one way to do your first version:
find -type f -regex ".*/.*\.\(shtml\|css\)"
Solution 3
You need to parenthesize to only include files:
find . -type f \( -name "*.shtml" -o -name "*.css" \) -print
Bonus: this is POSIX-compliant syntax.
Solution 4
I often find myself ending up using egrep, or longer pipes, or perl for even more complex filters:
find . -type f | egrep '\.(shtml|css)$'
find . -type f | perl -lne '/\.shtml|\.css|page\d+\.html$/ and print'
It may be somewhat less efficient but that isn't usually a concern, and for more complex stuff it's usually easier to construct and modify.
The standard caveat applies about not using this for files with weird filenames (e.g. containing newlines).
Related videos on Youtube
Comments
-
Dave Jarvis over 1 year
What is the correct syntax for:
find . -type f -name \*.\(shtml\|css\)
This works, but is inelegant:
find . -type f -name \*.shtml > f.txt && find . -type f -name \*.css >> f.txt
How to do the same, but in fewer keystrokes?
-
Teddy about 14 yearsThat will also print directories named "*.css".
-
Chris Johnsen about 14 yearsHmm, the parentheses in your updated version are a bit misplaced. The individual parentheses need to end up as separate parameters to find, so they need spaces around them (` ".css") ` results in a single string value; it is the same as (e.g.) ` '.css)'
). Second, the parentheses need to go around whole ‘primaries’ (the open parenthesis needs to be before
-name`, not between it and its ‘operand’). -
Cristik over 6 years+1 for a clean and modular solution, the performance bottlenecks usually occur while processing the files resulted from the search results.