Use find
:
find . -name "foo*"
find
needs a starting point, so the .
(dot) points to the current directory.
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.
find
command that supports those options. Sometimes grep
becomes the only option.
find
will find all files that match a pattern:
find . -name "*foo"
However, if you want a picture:
tree -P "*foo"
Hope this helps!
brew install tree
for Mac OSX users w/o apt-get
installed
fd
In case, find
is too slow, try fd
utility - a simple and fast alternative to find
written in Rust.
Syntax:
fd PATTERN
Demo:
https://github.com/sharkdp/fd/raw/master/doc/screencast.svg?sanitize=true
Homepage: https://github.com/sharkdp/fd
asciinema
, then converted to GIF format, but I'm not sure.
asciicast2vector
can be used.
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
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.
bash-3.2$ shopt -s globstar
gives bash: shopt: globstar: invalid shell option name
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.
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.
You can use:
# find . -type f -name 'text_for_search'
If you want use REGX use -iname
# find . -type f -iname 'text_for_search'
for file search find / -xdev -name settings.xml
--> whole computer find ./ -xdev -name settings.xml
--> current directory & its sub directory
for files with 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
Default way to search for recursive file, and available in most cases is
find . -name "filepattern"
It starts recursive traversing for filename or pattern from within current directory where you are positioned. With find command, you can use wildcards, and various switches, to see 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 then find, which are traversing your whole filesystem and indexing your files, one such common tool is locate or slocate/mlocate, you should check manual of your OS on how to install it, and once it's installed it needs to initiate database, if install script don'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 filename or patter from within 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 pattern that you have typed. To see full list of locate's options, type: locate --help
or man locate
Additionally you can configure locate to update it's database on scheduled times via cron job, so sample cron which updates db at 1AM would look like:
0 1 * * * updatedb
These cron jobs need to be configured by root, since updatedb needs root privilege to traverse whole filesystem.
Following command will list down all the files having exact name "pattern" (for example) in current and its sub folders.
find ./ -name "pattern"
If you want to search special file with wildcard, you can used 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.
Below command helps to search for any files 1) Irrespective of case 2) Result Excluding folders without permission 3) Searching from the root or from the path you like. Change / with the path you prefer. Syntax : find -iname '' 2>&1 | grep -v "Permission denied" Example
find / -iname 'C*.xml' 2>&1 | grep -v "Permission denied"
find / -iname '*C*.xml' 2>&1 | grep -v "Permission denied"
find / -iname '*C*.xml' 2>/dev/null
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
Try with fd
command if installed. Install instruction
find all file starts with 'name'
fd "name*"
This command ignores all .hidden
and .gitignore
ed files.
To include .gitignore
ed files, add -I
option as below
fd -I "name*"
To include hidden files, add -H
option as below
fd -H "name*"
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.
Success story sharing
find . foo*
, thefoo*
would be expanded AND THEN passed to find." "
is very necessary for recursive searching.find . -name "foo*" 2>/dev/null