Find all files with name containing string

2019-01-10 01:27发布

I have been searching for a command that will return files from the current directory which contain a string in the filename. I have seen locate and find commands that can find files beginning with something first_word* or ending with something *.jpg.

How can I return a list of files which contain a string in the filename?

For example, if 2012-06-04-touch-multiple-files-in-linux.markdown was a file in the current directory.

How could I return this file and others containing the string touch? Using a command such as find '/touch/'

7条回答
疯言疯语
2楼-- · 2019-01-10 01:29

An alternative to the many solutions already provided is making use of the glob **. When you use bash with the option globstar (shopt -s globstar) or you make use of zsh, you can just use the glob ** for this.

**/bar

does a recursive directory search for files named bar (potentially including the file bar in the current directory). Remark that this cannot be combined with other forms of globbing within the same path segment; in that case, the * operators revert to their usual effect.

Note that there is a subtle difference between zsh and bash here. While bash will traverse soft-links to directories, zsh will not. For this you have to use the glob ***/ in zsh.

查看更多
Root(大扎)
3楼-- · 2019-01-10 01:41

Use grep as follows:

grep -R "touch" .

-R means recurse. If you would rather not go into the subdirectories, then skip it.

-i means "ignore case". You might find this worth a try as well.

查看更多
萌系小妹纸
4楼-- · 2019-01-10 01:44

The -maxdepth option should be before the -name option, like below.,

find . -maxdepth 1 -name "string" -print
查看更多
爱情/是我丢掉的垃圾
5楼-- · 2019-01-10 01:46

If the string is at the beginning of the name, you can do this

$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt
查看更多
仙女界的扛把子
6楼-- · 2019-01-10 01:48
find $HOME -name "hello.c" -print

This will search the whole $HOME (i.e. /home/username/) system for any files named “hello.c” and display their pathnames:

/Users/user/Downloads/hello.c
/Users/user/hello.c

However, it will not match HELLO.C or HellO.C. To match is case insensitive pass the -iname option as follows:

find $HOME -iname "hello.c" -print

Sample outputs:

/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c

Pass the -type f option to only search for files:

find /dir/to/search -type f -iname "fooBar.conf.sample" -print
find $HOME -type f -iname "fooBar.conf.sample" -print

The -iname works either on GNU or BSD (including OS X) version find command. If your version of find command does not supports -iname, try the following syntax using grep command:

find $HOME | grep -i "hello.c"
find $HOME -name "*" -print | grep -i "hello.c"

OR try

find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print

Sample outputs:

/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c
查看更多
地球回转人心会变
7楼-- · 2019-01-10 01:50
grep -R "somestring" | cut -d ":" -f 1
查看更多
登录 后发表回答