如何基于通配符匹配递归查找当前和子文件夹中的所有文件?


当前回答

如果已安装,请尝试使用fd命令。安装说明。

查找以“name”开头的所有文件:

fd "name*"

此命令忽略所有.hhidden和.gitignoreed文件。

要包含.gitignoreed文件,请添加-I选项,如下所示:

fd -I "name*"

要包含隐藏文件,请添加-H选项,如下所示:

fd -H "name*"

其他回答

Use

find path/to/dir -name "*.ext1" -o -name "*.ext2"

解释

第一个参数是要搜索的目录。默认情况下,find执行递归。-o代表-或。所以上面的意思是搜索这个通配符或这个。如果您只有一个模式,那么不需要-o。通配符模式周围的引号是必填的。

如果已安装,请尝试使用fd命令。安装说明。

查找以“name”开头的所有文件:

fd "name*"

此命令忽略所有.hhidden和.gitignoreed文件。

要包含.gitignoreed文件,请添加-I选项,如下所示:

fd -I "name*"

要包含隐藏文件,请添加-H选项,如下所示:

fd -H "name*"
find -L . -name "foo*"

在少数情况下,我需要-L参数来处理符号目录链接。默认情况下,忽略符号链接。在这些情况下,这非常令人困惑,因为我会将目录更改为子目录,并看到与模式匹配的文件,但find不会返回文件名。使用-L解决了这个问题。查找的符号链接选项为-P-L-H

如果您的shell支持新的globbing选项(可以通过:shopt-s globstar启用),则可以使用:

echo **/*foo*

递归查找任何文件或文件夹。这得到了Bash 4、zsh和类似外壳的支持。


我个人已经定义了这个shell函数:

f() { find . -name "*$1*"; }

注意:以上行可以直接粘贴到shell或添加到用户的~/.bashrc文件中。

然后我可以通过键入以下内容来查找任何文件:

f some_name

或者,您可以使用具有简单语法的fd实用程序,例如fd模式。

递归搜索文件的默认方法,在大多数情况下可用的方法是

find . -name "filepattern"

它开始从您所在的当前目录中递归遍历文件名或模式。使用find命令,可以使用通配符和各种开关。要查看选项的完整列表,请键入

man find

或者如果系统中没有手册页:

find --help

然而,还有比find更现代、更快的工具,它们可以遍历整个文件系统并为文件编制索引。一种常见的工具是locate或slocate/mlocate。您应该查看操作系统的手册,了解如何安装它,一旦安装完成,就需要启动数据库。如果安装脚本不适合您,可以通过键入

sudo updatedb

并且,要使用它查找某些特定文件,请键入:

locate filename

或者,要在当前目录中查找文件名或模式,可以键入:

pwd | xargs -n 1 -I {} locate "filepattern"

它将查看其文件数据库,并快速打印出与您键入的模式匹配的路径名。要查看查找选项的完整列表,请键入:locate--帮助或手动定位

此外,您可以将locate配置为通过cron作业在计划时间更新其数据库,因此在凌晨1点更新数据库的示例cron如下所示:

0 1 * * * updatedb

这些cron作业需要由root配置,因为updatedb需要root权限才能遍历整个文件系统。