在当前目录及子文件夹中基于通配符递归查找文件的方法
技术背景
在日常的系统运维和开发工作中,经常需要在当前目录及其子文件夹中查找符合特定模式的文件。使用通配符可以方便地指定查找模式,而递归查找则能确保搜索到所有子目录下的文件。
实现步骤
使用 find 命令
find 是一个强大的命令行工具,可用于在文件系统中查找文件。
- 基本查找:从当前目录开始查找以
foo 开头的文件。
- 大小写不敏感查找:使用
-iname 选项进行大小写不敏感的查找。
- 使用正则表达式查找:结合
grep 命令,利用正则表达式进行更灵活的匹配。
1
| find . -print | grep -i foo
|
1
| find <directory_path> -type f -name "*.c"
|
- 查找多个模式的文件:查找
.ext1 或 .ext2 后缀的文件。
1
| find path/to/dir -name "*.ext1" -o -name "*.ext2"
|
使用 fd 工具
fd 是一个用 Rust 编写的快速文件查找工具,是 find 的替代方案。
- 包含
.gitignore 文件:使用 -I 选项。
使用 locate 命令
locate 通过预先建立的文件索引数据库进行快速查找。
- 从当前目录查找:结合
pwd 和 xargs 从当前目录查找。
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 命令查找文件
Python 递归查找 .txt 文件
1 2
| import glob [print(x) for x in glob.glob('./**/*txt', recursive=True)]
|
最佳实践
- 选择合适的工具:如果文件系统较小,
find 命令通常足够;如果需要快速查找,fd 或 locate 可能更合适。 - 定期更新索引:使用
locate 时,定期运行 sudo updatedb 以保持索引的最新状态。 - 使用函数简化操作:可以在
.bashrc 中定义函数来简化查找操作。
1
| f() { find . -name "*$1*"; }
|
常见问题
find 不返回符号链接文件:默认情况下,find 会忽略符号链接。可以使用 -L 选项处理符号链接。locate 查找结果不准确:可能是因为索引数据库未及时更新,需要运行 sudo updatedb 更新数据库。- 权限问题:在查找过程中可能会遇到权限问题,可以使用
2>&1 | grep -v "Permission denied" 过滤权限错误信息。