Velvet Star Monitor

Standout celebrity highlights with iconic style.

general

Recursively find files with a specific extension

Writer Sebastian Wright

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

9 Answers

My preference:

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

Using find's -regex argument:

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

Or just using -name:

find . -name 'Robert.*' -a \( -name '*.cpp' -o -name '*.h' \)
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".

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

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

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

Using bash globbing (if find is not a must)

ls Robert.{pdf,jpg} 

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

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

For finding the files in system using the files database:

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

Make sure locate package is installed i.e. mlocate

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy