在当前目录及子文件夹中基于通配符递归查找文件的方法

在当前目录及子文件夹中基于通配符递归查找文件的方法

技术背景

在日常的系统运维和开发工作中,经常需要在当前目录及其子文件夹中查找符合特定模式的文件。使用通配符可以方便地指定查找模式,而递归查找则能确保搜索到所有子目录下的文件。

实现步骤

使用 find 命令

find 是一个强大的命令行工具,可用于在文件系统中查找文件。

  • 基本查找:从当前目录开始查找以 foo 开头的文件。
1
find . -name "foo*"
  • 大小写不敏感查找:使用 -iname 选项进行大小写不敏感的查找。
1
find . -iname "foo*"
  • 使用正则表达式查找:结合 grep 命令,利用正则表达式进行更灵活的匹配。
1
find . -print | grep -i foo
  • 处理符号链接:使用 -L 选项处理符号链接。
1
find -L . -name "foo*"
  • 查找特定类型文件:查找所有 .c 文件。
1
find <directory_path>  -type f -name "*.c"
  • 查找多个模式的文件:查找 .ext1.ext2 后缀的文件。
1
find path/to/dir -name "*.ext1" -o -name "*.ext2"

使用 fd 工具

fd 是一个用 Rust 编写的快速文件查找工具,是 find 的替代方案。

  • 基本查找:查找所有以 name 开头的文件。
1
fd "name*"
  • 包含 .gitignore 文件:使用 -I 选项。
1
fd -I "name*"
  • 包含隐藏文件:使用 -H 选项。
1
fd -H "name*"

使用 locate 命令

locate 通过预先建立的文件索引数据库进行快速查找。

  • 初始化数据库:首次使用前需要初始化数据库。
1
sudo updatedb
  • 查找文件:查找特定文件名或模式的文件。
1
locate filename
  • 从当前目录查找:结合 pwdxargs 从当前目录查找。
1
pwd | xargs -n 1 -I {} locate "filepattern"

使用 shell 的通配符

如果 shell 支持 globstar 选项,可以使用通配符进行递归查找。

1
2
shopt -s globstar
echo **/*foo*

使用 Python

  • Python 3.5 及以上版本:使用 glob 模块进行递归查找。
1
python -c "import glob;[print(x) for x in glob.glob('./**/*txt', recursive=True)]"
  • 旧版本 Python:可以安装 glob2 模块实现类似功能。

核心代码

find 命令查找特定后缀文件

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

fd 命令查找文件

1
fd "name*"

Python 递归查找 .txt 文件

1
2
import glob
[print(x) for x in glob.glob('./**/*txt', recursive=True)]

最佳实践

  • 选择合适的工具:如果文件系统较小,find 命令通常足够;如果需要快速查找,fdlocate 可能更合适。
  • 定期更新索引:使用 locate 时,定期运行 sudo updatedb 以保持索引的最新状态。
  • 使用函数简化操作:可以在 .bashrc 中定义函数来简化查找操作。
1
f() { find . -name "*$1*"; }

常见问题

  • find 不返回符号链接文件:默认情况下,find 会忽略符号链接。可以使用 -L 选项处理符号链接。
  • locate 查找结果不准确:可能是因为索引数据库未及时更新,需要运行 sudo updatedb 更新数据库。
  • 权限问题:在查找过程中可能会遇到权限问题,可以使用 2>&1 | grep -v "Permission denied" 过滤权限错误信息。

在当前目录及子文件夹中基于通配符递归查找文件的方法
https://119291.xyz/posts/2025-05-12.methods-for-recursively-finding-files-based-on-wildcard-matching/
作者
ww
发布于
2025年5月12日
许可协议