Using `find` for multiple file extensions
I am using the following command for counting the lines of text in JAVA files:
find . -name '*.java' | xargs wc -l
How can I modify the find
command parameters to match more than one file extension? For example, I would like use the above operation for CPP, C, and H files.
Use the -o
option for an OR. For example, this would list .cpp
, .c
and .h
files:
find . -name \*.cpp -o -name \*.c -o -name \*.h
You will need to use the -o option. For example the statement below finds all png, jpg and gif files in a folder.
find . \( -iname \*.png -o -iname \*.jpg -o -iname \*.gif \)
I use the -iname option so that the match is case insensitive.
$ find /path/ -name '*.cpp' -or -name '*.c' -or -name '*.h'
The “-or” says I’m looking for either/both of two sets.
I recently wrote a quick guide to using find with boolean operators here: http://jamesfishwick.com/2012/linux-find-and-boolean-operators
While all answers are more or less the same, I don't find them readable with multiple name and Boolean operators in-between.
I think this may be more elegant solution:
$ find . -type f | grep -E "\.java$|\.cpp$|\.c$"
Let's break this up
-
find .
finds all files recursively in current path (change to some other path if you need) -
-type f
narrows the search only to files (not too much of a speed gain, but still...) -
| grep -E
I used this to get grep recognize or (|
) operator in Mac OS X which uses FreeBSD grep, GNU grep does not need that (check in yourman
file). -
"\.java$|\.cpp$|\.c$"
regular expression which includes files whose name ends with.java
,.cpp
, and.c
(add ones you need)
You can then pipe the resulting list for further processing, e.g.
$ find . -type f | grep -E "\.java$|\.cpp$|\.c$" | xargs sed -i '' $'/s/\r$//'
This example removes DOS/Windows CRLF
line ending for OS X/Linux LF
(this is also OS X sed
syntax, check for your version specifics).