Say there are files with names:
batman.c debate.c cricketbat.c
What command and how should I use it to list all these files by using the searchtag
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It only takes a minute to sign up.Sign up to join this community
To find all files anywhere inside
/path/to/folder whose names contain
bat, you can use:
find /path/to/folder -name '*bat*'
I have quoted the search pattern
*bat* because, if the quotes were omitted and files match
*bat* in the current directory, the shell will expand
*bat* into a list of them and pass that to
find wouldn't work right. (
"*bat*" also work.)
To search in the folder you're currently in (e.g., that you've
cded to), use
., as usual:
find . -name '*bat*'
If you want to search case-insensitively, so files containing
bAt, and so forth are matched, use the
-iname test instead of the
find /path/to/folder -iname '*bat*'
I've noticed all your files end in
.c. If you only want to find files like that, use:
find /path/to/folder -name '*bat*.c'
I noticed all your filenames have
bat either at the very beginning or the very end of the part preceding the
.c suffix. If you want to avoid matching files like
embattled.c, you could use:
find /path/to/folder -name '*bat.c' -o -name 'bat*.c'
-o is the or operator.
To find only regular files--and not folders, symbolic links, and special device nodes--you can use
-type f. This is frequently recommended and sometimes quite appropriate... but often not what you really want, especially if you're running
find for the purpose of examining the output yourself. If you had a symbolic link that matched your search, wouldn't you want to know about it?
If you want to find both regular files and symbolic links, you can use:
find /path/to/folder -name '*bat*' \( -type f -o -type l \)
That uses the
-o operator and also parentheses for grouping (which must be quoted so the shell does not treat them specially; otherwise you'll get a syntax error).
But suppose you only want to see symbolic links that ultimately point to a regular file (and not symbolic links to directories, device nodes, etc.). That's actually even simpler: use
-xtype instead of
-type. Provided you're not running
-xtype on a symbolic link tests the type of the file the link points to.
find /path/to/folder -name '*bat*' -xtype f
If you have a symlink to another symlink to a file,
-xtype f will match it even though its direct target is another symlink rather than a regular file. This is almost always what you want.
Often people think they want
-type f, but really they want
find's default action if you don't specify one is
find is often used to run commands based on the files found--often, commands that make changes. But there are also other actions whose purpose is to display results, besides
find /path/to/folder -name '*bat*' -ls
This gives detailed information on each file, in a multi-column format, similar to (though not quite the same as) what you would see by running
For more information on
find and other ways to find files, see:
Open the terminal and change directories to the directory from where you want to start searching and then run this command:
find . -name "*bat*" -type f
. starts the find command from the current directory.
-name matches the string
bat and is case sensitive. (
-iname is case insensitive)
-type f searches for files only.
If the files are in the current directory use:
$ ls *bat* batgirl.c batman.c batwoman.c cricketbat.c
Or (to have them line by line):
$ ls -1 *bat* batgirl.c batman.c batwoman.c cricketbat.c
If you want to search the system for that files, use:
$ find / -name "*bat*" /path/to/cricketbat.c /path/to/batgirl.c /path/to/batwoman.c /path/to/batman.c
You want to use the
find command, with the
-iname option for case insensitive file name matching, or the
-name option for case sensitive file name matches. Both of these will let you use wildcard names. So, to find any file names which contain "bat" you would use:
find / -iname '*bat*'
find / -name '*bat*'
* means "any character(s)", so the search is looking for
bat with any characters, including none, before or after it. The
/ searches from the root directory recursively, you can use
. which will search recursively from the current directory, or the absolute path for where you want to search from.
Take a look at how search for files using regex in linux shell script
Use the good old
find <path_for_search> -type f -iname "*bat*"
% find . -type f -iname "*bat*" ./batgirl.c ./batwoman.c ./cricketbat.c ./batman.c
-type c File is of type c: [..] d directory [..] f regular file [..] -iname pattern Like -name, but the match is case insensitive.