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


使用查找:

find . -name "foo*"

find需要一个起点,所以。(点)指向当前目录。


find将查找与模式匹配的所有文件:

find . -name "*foo"

但是,如果您需要图片:

tree -P "*foo"

通过管道找到grep通常更方便;它为您提供了用于任意通配符匹配的正则表达式的全部功能。

例如,要查找文件名中不区分大小写字符串“foo”的所有文件:

find . -print | grep -i foo

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

echo **/*foo*

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


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

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

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

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

f some_name

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


find -L . -name "foo*"

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


Use

find <directory_path>  -type f -name "<wildcard-match>"

在通配符匹配中,您可以提供希望匹配的字符串,例如*.c(对于所有c文件)。


用于文件搜索

查找/-xdev-name settings.xml→ 整个计算机查找。/-xdev-名称设置.xml→ 当前目录及其子目录

对于具有扩展名类型的文件:

find . -type f -name "*.iso"

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

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权限才能遍历整个文件系统。


您可以使用:

find . -type f  -name 'text_for_search'

如果要使用正则表达式,请使用-iname:

find . -type f  -iname 'text_for_search'

如果要使用通配符搜索特殊文件,可以使用以下代码:

find . -type f -name "*.conf"

假设您想从这里搜索每个.conf文件:

.表示从此处(当前位置)开始搜索-type表示此处为文件(f)的搜索项的类型。-name表示您希望使用*.conf名称搜索文件。


fd

如果查找速度太慢,请尝试fd实用程序,这是一个简单而快速的替代方法,可以在Rust中查找。

语法:

fd PATTERN

演示:

主页:https://github.com/sharkdp/fd


以下命令有助于搜索任何文件

无论情况如何未经许可排除文件夹的结果从根目录或您喜欢的路径搜索。更改/使用您喜欢的路径。

语法:

find <FromDirectory> -iname '<FileName wild char allowed>'   2>&1 | grep -v "Permission denied"

实例

find / -iname 'C*.xml' 2>&1 | grep -v "Permission denied"

以下命令将列出当前及其子文件夹中具有确切名称“pattern”(例如)的所有文件。

查找。/-名称“pattern”


这将搜索当前目录和子目录中的所有相关文件,分别计算它们的行数以及总数:

find . -name "*.wanted" | xargs wc -l

我很惊讶地发现,当我们递归地执行时,locate并没有被大量使用。

我将首先定位“$PWD”以获取当前感兴趣文件夹中的文件列表,然后根据需要对它们运行grep。

locate "$PWD" | grep -P <pattern>

当然,这是假设updatedb已完成,索引定期更新。这是一种查找文件的方式,比运行查找并要求它从树上下来快得多。提及这一点是为了完整。如果这棵树不是很重,就不反对使用find。


Use

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

解释

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


对于Python>3.5,使用glob。指向当前文件夹并查找.txt文件:

 python -c "import glob;[print(x) for x in glob.glob('./**/*txt', recursive=True)]"

对于较旧版本的Python,可以安装glob2


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

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

fd "name*"

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

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

fd -I "name*"

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

fd -H "name*"

你也可以使用ripgrep。

例子:

搜索所有包含子字符串psql的文件名,

rg --files | rg psql