如何根据通配符匹配递归地查找当前文件夹和子文件夹中的所有文件?
- 2024-10-09 09:11:00
- admin 原创
- 85
问题描述:
如何根据通配符匹配递归地查找当前文件夹和子文件夹中的所有文件?
解决方案 1:
使用find
:
find . -name "foo*"
find
需要一个起点,因此.
(点)指向当前目录。
如果您需要不区分大小写的搜索,请使用:
find . -iname "foo*"
解决方案 2:
将find插入grep通常更方便;它为您提供正则表达式的全部功能,以实现任意通配符匹配。
例如,要查找文件名中包含不区分大小写的字符串“foo”的所有文件:
find . -print | grep -i foo
解决方案 3:
find
将找到所有符合某个模式的文件:
find . -name "*foo"
但是,如果你想要一张图片:
tree -P "*foo"
解决方案 4:
fd
如果find
太慢,请尝试实用程序 - 一种用Rust编写的fd
简单而快速的替代方案。find
句法:
fd PATTERN
演示:
主页:https://github.com/sharkdp/fd
解决方案 5:
find -L . -name "foo*"
在少数情况下,我需要 -L 参数来处理符号目录链接。默认情况下,符号链接会被忽略。在这些情况下,这非常令人困惑,因为我会将目录更改为子目录并查看与模式匹配的文件,但 find 不会返回文件名。使用 -L 解决了这个问题。find 的符号链接选项是 -P -L -H
解决方案 6:
使用
find <directory_path> -type f -name "<wildcard-match>"
在通配符匹配中,您可以提供想要匹配的字符串,例如 *.c(对于所有 C 文件)。
解决方案 7:
如果你的 shell 支持新的通配符选项(可以通过以下方式启用shopt -s globstar
:),你可以使用:
echo **/*foo*
以递归方式查找任何文件或文件夹。Bash 4、zsh 和类似 shell 支持此功能。
我个人已经定义了这个 shell 函数:
f() { find . -name "*$1*"; }
注意:上面这行可以直接粘贴到 shell 中或者添加到你的用户~/.bashrc
文件中。
然后我可以通过输入以下内容来查找任何文件:
f some_name
或者,您可以使用具有简单语法的fd
实用程序fd pattern
,例如。
解决方案 8:
使用
find path/to/dir -name "*.ext1" -o -name "*.ext2"
解释
第一个参数是您要搜索的目录。
默认情况下
find
进行递归。代表。因此上面的意思是搜索这个通配符或这个。如果你只有一个模式
-o
,-or
那么就不需要-o
。通配符模式两侧的引号是必需的。
解决方案 9:
您可以使用:
find . -type f -name 'text_for_search'
如果您想使用正则表达式,请使用-iname
:
find . -type f -iname 'text_for_search'
解决方案 10:
在大多数情况下,默认的递归搜索文件的方式是
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 --help
或man locate
此外,您可以配置locate通过cron作业在预定的时间更新其数据库,因此在凌晨1点更新数据库的示例cron如下所示:
0 1 * * * updatedb
这些 cron 作业需要由root配置,因为updatedb需要 root 权限来遍历整个文件系统。
解决方案 11:
用于文件搜索
find / -xdev -name settings.xml
→ 整个计算机
find ./ -xdev -name settings.xml
→ 当前目录及其子目录
对于具有扩展名类型的文件:
find . -type f -name "*.iso"
解决方案 12:
令我惊讶的是,当我们进行递归操作时,locate 并没有被大量使用。
我首先会执行定位“$PWD”来获取当前感兴趣的文件夹中的文件列表,然后根据需要对它们运行 greps。
locate "$PWD" | grep -P <pattern>
当然,这是假设 updatedb 已完成并且索引定期更新。与运行 find 并要求其遍历树相比,这是查找文件的速度更快的方法。提到这一点是为了完整性。如果树不是很重,使用 find 没什么不好。
解决方案 13:
以下命令将列出当前文件夹及其子文件夹中具有精确名称“pattern”(例如)的所有文件。
find ./ -name "pattern"
解决方案 14:
以下命令有助于搜索任何文件
不论大小写
结果排除未经许可的文件夹
从根目录或您喜欢的路径搜索。将 / 更改为您喜欢的路径。
句法:
find <FromDirectory> -iname '<FileName wild char allowed>' 2>&1 | grep -v "Permission denied"
例子
find / -iname 'C*.xml' 2>&1 | grep -v "Permission denied"
解决方案 15:
这将搜索当前目录和子目录中的所有相关文件,并分别计算它们的行数以及总行数:
find . -name "*.wanted" | xargs wc -l
解决方案 16:
fd
如果已安装,请尝试使用该命令。安装说明。
查找所有以“name”开头的文件:
fd "name*"
此命令忽略所有.hidden
和.gitignore
ed 文件。
要包含.gitignore
ed 文件,请添加-I
以下选项:
fd -I "name*"
要包含隐藏文件,请添加-H
以下选项:
fd -H "name*"
解决方案 17:
如果要使用通配符搜索特殊文件,可以使用以下代码:
find . -type f -name "*.conf"
假设您想从这里搜索每个 .conf 文件:
.
表示从这里(当前位置)开始搜索
-type
,表示这里的搜索项类型是文件(f)。
-name
表示您要搜索名称为 * .conf 的文件。
解决方案 18:
您也可以使用ripgrep。
例子:
搜索所有文件名包含子字符串psql,
rg --files | rg psql
解决方案 19:
使用 Python>3.5,使用glob,.
指向当前文件夹并查找.txt
文件:
python -c "import glob;[print(x) for x in glob.glob('./**/*txt', recursive=True)]"
对于较旧版本的 Python,你可以安装glob2
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件