在当前目录及子文件夹中基于通配符递归查找文件的方法
技术背景
在日常的系统运维和开发工作中,经常需要在当前目录及其子文件夹中查找符合特定模式的文件。使用通配符可以方便地指定查找模式,而递归查找则能确保搜索到所有子目录下的文件。
实现步骤
使用 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"
过滤权限错误信息。