How can I recursively find all files in current and subfolders based on wildcard matching?
Use find
:
find . -name "foo*"
find
needs a starting point, so the .
(dot) points to the current directory.
If you need case insensitive search use :
find . -iname "foo*"
find . foo*
, the foo*
would be expanded AND THEN passed to find. –
Melaniemelanin " "
is very necessary for recursive searching. –
Retroactive find . -name "foo*" 2>/dev/null
–
Pompon " "
is needed? What is "expansion" and why is that bad? –
Nosology *
expansion is "iterate current dir and substitute the * with every file name". So, to avoid this, we use quotes. –
Retroactive ls
? –
Malefaction find /some/path/ -iname "foo*"
–
Truism -type f
–
Parlay string1*string2*
, for example /home/string1bla/string2.txt
, how would I do this? –
Achondrite -path
option, see superuser.com/a/400086/728074. –
Achondrite Piping find into grep is often more convenient; it gives you the full power of regular expressions for arbitrary wildcard matching.
For example, to find all files with case insensitive string "foo" in the filename:
find . -print | grep -i foo
find
also has the -iname
, -regex
, and -iregex
flags for case-insensitive wildcard, regex, and case-insensitive regex matching, so piping to grep
is unnecessary. –
Rolandorolandson find
command that supports those options. Sometimes grep
becomes the only option. –
Pismire foo
but got answers: Fooled Around
, Fool Would Say
, Fool's Overture
, Devil's Food
, Foo Fighters
, Foot In The Door
and Fooling Yourself
:) –
Substitutive find
will find all files that match a pattern:
find . -name "*foo"
However, if you want a picture:
tree -P "*foo"
brew install tree
for Mac OSX users w/o apt-get
installed –
Audiphone fd
In case find
is too slow, try the fd
utility - a simple and fast alternative to find
written in Rust.
Syntax:
fd PATTERN
Demo:
Homepage: https://github.com/sharkdp/fd
fd
is faster than find
. The reason: "Very fast due to parallelized directory traversal" –
Parenteau find -L . -name "foo*"
In a few cases, I have needed the -L parameter to handle symbolic directory links. By default symbolic links are ignored. In those cases it was quite confusing as I would change directory to a sub-directory and see the file matching the pattern but find would not return the filename. Using -L solves that issue. The symbolic link options for find are -P -L -H
Use
find <directory_path> -type f -name "<wildcard-match>"
In the wildcard-match you can provide the string you wish to match, e.g., *.c (for all C files).
find
detect symbolic file links (but not the ones in symbolic directory links). -type f
will cause find
to not detect symbolic file links. If you also want to include symlinks that point to a file, use -L
: find -L <optional_directory_path> -type f
. Don't use -type f,l
since it will also include symbolic directory links. –
Parlay If your shell supports a new globbing option (can be enabled by: shopt -s globstar
), you can use:
echo **/*foo*
to find any files or folders recursively. This is supported by Bash 4, zsh and similar shells.
Personally I've got this shell function defined:
f() { find . -name "*$1*"; }
Note: Above line can be pasted directly to shell or added into your user's ~/.bashrc
file.
Then I can look for any files by typing:
f some_name
Alternatively you can use a fd
utility with a simple syntax, e.g. fd pattern
.
shopt -s globstar
command. This is supported in Bash, zsh and similar shells. –
Australian bash-3.2$ shopt -s globstar
gives bash: shopt: globstar: invalid shell option name
–
Clishmaclaver Use
find path/to/dir -name "*.ext1" -o -name "*.ext2"
Explanation
- The first parameter is the directory you want to search.
- By default
find
does recursion. - The
-o
stands for-or
. So above means search for this wildcard OR this one. If you have only one pattern then no need for-o
. - The quotes around the wildcard pattern are required.
The default way to search for files recursively, and available in most cases is
find . -name "filepattern"
It starts recursively traversing for filename or pattern from within the current directory where you are positioned. With the find command, you can use wildcards, and various switches. To see the full list of options, type
man find
Or if man pages aren't available at your system:
find --help
However, there are more modern and faster tools than find, which are traversing your whole filesystem and indexing your files. One such common tool is locate or slocate/mlocate. You should check the manual of your OS on how to install it, and once it's installed, it needs to initiate the database. If the install script doesn't do it for you, it can be done manually by typing
sudo updatedb
And, to use it to look for some particular file, type:
locate filename
Or, to look for a filename or pattern from within the current directory, you can type:
pwd | xargs -n 1 -I {} locate "filepattern"
It will look through its database of files and quickly print out path names that match the pattern that you have typed.
To see the full list of locate's options, type:
locate --help
or man locate
Additionally, you can configure locate to update its database on scheduled times via a cron job, so a sample cron which updates the database at 1 AM would look like:
0 1 * * * updatedb
These cron jobs need to be configured by root, since updatedb needs root privileges to traverse the whole filesystem.
You can use:
find . -type f -name 'text_for_search'
If you want use a regular expression, use -iname
:
find . -type f -iname 'text_for_search'
For file search
find / -xdev -name settings.xml
→ the whole computer
find ./ -xdev -name settings.xml
→ the current directory and its subdirectories
For files with an extension type:
find . -type f -name "*.iso"
I am surprised to see that locate is not used heavily when we are to go recursively.
I would first do a locate "$PWD" to get the list of files in the current folder of interest, and then run greps on them as I please.
locate "$PWD" | grep -P <pattern>
Of course, this is assuming that the updatedb is done and the index is updated periodically. This is much faster way to find files than to run a find and asking it go down the tree. Mentioning this for completeness. Nothing against using find, if the tree is not very heavy.
locate "$PWD*.mp4"
Just to remind that you may be able to skip the grep
–
Bailey The following command will list down all the files having the exact name "pattern" (for example) in the current and its sub folders.
find ./ -name "pattern"
This will search all the related files in current and sub directories, calculating their line count separately as well as totally:
find . -name "*.wanted" | xargs wc -l
The below command helps to search for any files
- Irrespective of case
- Result excluding folders without permission
- Searching from the root or from the path you like. Change / with the path you prefer.
Syntax:
find <FromDirectory> -iname '<FileName wild char allowed>' 2>&1 | grep -v "Permission denied"
Example
find / -iname 'C*.xml' 2>&1 | grep -v "Permission denied"
find / -iname '*C*.xml' 2>/dev/null
–
Perpetua If you want to search special files with a wildcard, you can use the following code:
find . -type f -name "*.conf"
Suppose, you want to search every .conf files from here:
.
means search started from here (current place)
-type
means type of search item that here is file (f).
-name
means you want to search files with *.conf names.
Try with the fd
command if installed. Install instructions.
Find all files that start with 'name':
fd "name*"
This command ignores all .hidden
and .gitignore
ed files.
To include .gitignore
ed files, add the -I
option as below:
fd -I "name*"
To include hidden files, add the -H
option as below:
fd -H "name*"
You can also use ripgrep.
Example:
Search all the filenames contain substring psql,
rg --files | rg psql
With Python>3.5, using glob, .
pointing to your current folder and looking for .txt
files:
python -c "import glob;[print(x) for x in glob.glob('./**/*txt', recursive=True)]"
For older versions of Python, you can install glob2
sed
with accepted answers that use awk
and similar. [...] It feels like this is getting downvoted by people following the trend instead of thinking about it. – But both sed
and awk
are command line tools, while the Python is a full-featured programming language. Downvoting answers costs rep which discourages doing so for no reason, but if you still think it's a voting fraud, have a read of this post. P.S.: Please use comments or Stack Overflow Chat for discussions, they don't belong in answers. –
Globuliferous © 2022 - 2024 — McMap. All rights reserved.