ChatGPT解决这个技术问题 Extra ChatGPT

Recursively find files with a specific extension

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 !

Anyone copying this command, or any below it, should use iname instead - which is case insensitive.
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.

w
wjandrea

My preference:

find . -name '*.jpg' -o -name '*.png' -print | grep Robert

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.
E
Etan Reisner

Using find's -regex argument:

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

Or just using -name:

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

M
Mark Setchell
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".


j
jxh

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}

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.
C
Community

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

c
clt60

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

o
once

Using bash globbing (if find is not a must)

ls Robert.{pdf,jpg} 

w
wuseman

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

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

h
heyzsh

For finding the files in system using the files database:

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

Make sure locate package is installed i.e. mlocate