131

I'm trying to find files with specific extensions. For example, I want to find all .pdf and .jpg files that's named Robert

I know I can do this command

$ find . -name '*.h' -o -name '*.cpp' 

but I need to specify the name of the file itself besides the extensions. I just want to see if there's a possible way to avoid writing the file name again and over again Thank you !

2
  • 6
    Anyone copying this command, or any below it, should use iname instead - which is case insensitive. Commented Aug 31, 2018 at 0:12
  • 3
    Good point, Addison (hence the +1). However, it seems that the OP wants files named 'Robert' with a capital 'R'. As I interpret the post, this means that files containing 'robert' should NOT be outputted. 'Robert` is what's written. However, there are situations when someone would want either 'Robert' or 'robert' to be found. Maybe the OP is in this situation. Whether to use iname or name depends on what you want to find. I've been in situations where the case was essential. Commented Sep 7, 2018 at 6:26

9 Answers 9

164

My preference:

find . -name '*.jpg' -o -name '*.png' -print | grep Robert 
Sign up to request clarification or add additional context in comments.

3 Comments

Works nicely, but slight disadvantage is that it precludes you from doing a find -exec ...
what if I want find all xxx-deployment.yml files in all folders in a specific path?
This doesn't work so well if you have jpg or png as part of a longer path.
28

Using find's -regex argument:

find . -regex '.*/Robert\.\(h\|cpp\)$' 

Or just using -name:

find . -name 'Robert.*' -a \( -name '*.cpp' -o -name '*.h' \) 

Comments

8
find -name "*Robert*" \( -name "*.pdf" -o -name "*.jpg" \) 

The -o repreents an OR condition and you can add as many as you wish within the braces. So this says to find all files containing the word "Robert" anywhere in their names and whose names end in either "pdf" or "jpg".

Comments

3

As an alternative to using -regex option on find, since the question is labeled , you can use the brace expansion mechanism:

eval find . -false "-o -name Robert".{jpg,pdf} 

8 Comments

find report "paths must precede expression", what's the problem? I usually add quote to resolve it, but don't work for this expression. Thanks!
I suspect you either forgot eval or the . in the command above, or your find is an alias for something more complicated, or you are not using the stock GNU find on your version of Linux.
Thanks for you reply, I used a script like this: FILEEXTEIONS=cs,[ch] eval find . -false "-o -name *".{$FILEEXTEIONS}, and it report that error.
As far as I know, variable expansion will not occur inside the brace expansion braces.
I wanted to use this technique in an Android shell but its find does not support -false. I worked around this by giving two mutually-exclusive conditions so they are collectively false: -inum 1 -inum 2.
|
2

This q/a shows how to use find with regular expression: How to use regex with find command?

Pattern could be something like

'^Robert\\.\\(h|cgg\\)$' 

Comments

1

As a script you can use:

find "${2:-.}" -iregex ".*${1:-Robert}\.\(h\|cpp\)$" -print 
  • save it as findcc
  • chmod 755 findcc

and use it as

findcc [name] [[search_direcory]] 

e.g.

findcc # default name 'Robert' and directory . findcc Joe # default directory '.' findcc Joe /somewhere # no defaults 

note you cant use

findcc /some/where #eg without the name... 

also as alternative, you can use

find "$1" -print | grep "$@" 

and

findcc directory grep_options 

like

findcc . -P '/Robert\.(h|cpp)$' 

Comments

1

Using bash globbing (if find is not a must)

ls Robert.{pdf,jpg} 

Comments

0

Recurisvely with ls: (-al for include hidden folders)

ftype="jpg" ls -1R *.${ftype} 2> /dev/null 

Comments

0

For finding the files in system using the files database:

locate -e --regex "\.(h|cpp)$" 

Make sure locate package is installed i.e. mlocate

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.