关于linux:查找名称中包含string的所有文件

Find all files with name containing string

我一直在搜索一个命令,该命令将从当前目录返回包含文件名中字符串的文件。我见过locatefind命令,它们可以查找文件,从first_word*开始或以*.jpg结束。

如何返回文件名中包含字符串的文件列表?

例如,如果2012-06-04-touch-multiple-files-in-linux.markdown是当前目录中的文件。

如何返回此文件以及包含字符串touch的其他文件?使用诸如find '/touch/'之类的命令


使用find

find . -maxdepth 1 -name"*string*" -print

它将找到当前目录中包含"string"的所有文件(如果需要递归,则删除maxdepth 1),并将其打印到屏幕上。

如果要避免包含":"的文件,可以键入:

find . -maxdepth 1 -name"*string*" ! -name"*:*" -print

如果您想使用grep(但我认为不需要检查文件内容),您可以使用:

ls | grep touch

但是,我重复一遍,find是一个更好、更干净的解决方案。


使用grep如下:

1
grep -R"touch" .

-R表示重复发生。如果您不想进入子目录,那么跳过它。

-i的意思是"忽略大小写"。你可能觉得这个也值得一试。


-maxdepth选项应在-name选项之前,如下所示。

1
find . -maxdepth 1 -name"string" -print


1
find $HOME -name"hello.c" -print

这将在整个$HOME系统(即/home/username/系统)中搜索任何名为"hello.c"的文件,并显示其路径名:

1
2
/Users/user/Downloads/hello.c
/Users/user/hello.c

但是,它与HELLO.CHELLO.C不匹配。要匹配不区分大小写,请按如下方式传递-iname选项:

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

样品输出:

1
2
3
4
/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c

通过-type f选项仅搜索文件:

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

-iname在GNU或BSD(包括OS X)版本的find命令上工作。如果find命令的版本不支持-iname,请使用grep命令尝试以下语法:

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

或尝试

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

样品输出:

1
2
3
4
/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c

1
find / -exec grep -lR"{test-string}" {} \;


除了已经提供的许多解决方案之外,另一种解决方案是利用全球**。当您使用bash和选项globstar(shopt -s globstar)或使用zsh)时,您只需使用global **

1
**/bar

递归目录搜索名为bar的文件(可能包括当前目录中的文件bar)。请注意,这不能与同一路径段内的其他形式的全局化结合在一起;在这种情况下,*操作符将恢复其通常的效果。

请注意,这里的zshbash之间存在细微差异。虽然bash将遍历到目录的软链接,但zsh将不会。为此,您必须在zsh中使用global ***/


1
grep -R"somestring" | cut -d":" -f 1


如果字符串在名称的开头,则可以执行此操作

1
2
3
4
$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt