Unix glob是一种用于匹配文件路径的模式,它可以帮助我们快速地找到符合特定规则的文件。在本文中,我们将介绍glob的基本概念、使用方法以及一些实际应用案例。
glob介绍
Glob(Global Match)是Unix和类Unix系统中的一种文件名扩展功能,它可以根据指定的模式匹配文件名。Glob使用通配符来表示文件名中的特定字符或字符组合,例如*
表示任意数量的字符,?
表示一个字符,[]
表示一个字符集合等。通过这些通配符,我们可以轻松地筛选出符合特定规则的文件。
如何使用glob
在Unix和类Unix系统中,我们可以使用shell内置的glob
命令来匹配文件路径。
glob [选项] 模式
其中,模式是一个包含通配符的字符串,用来描述要匹配的文件名或目录名的模式。通配符可以包括以下特殊字符:
*
:匹配任意字符(包括空字符)。?
:匹配任意单个字符。[字符集]
:匹配字符集中的任意一个字符。[!字符集]
:匹配不在字符集中的任意一个字符。
可以使用引号将模式括起来,以避免特殊字符被Shell解释。
以下是一些常用的glob
命令选项:
-d
:仅匹配目录。-l
:仅匹配符号链接。-r
:递归地匹配子目录。-s
:匹配命令的结果总数。
Python中的glob内置模块
此外,我们还可以使用Python的glob内置
模块来实现类似的功能,该模块用来以特定格式匹配一系列路径,规则与Unix Shell相同,返回一个包含匹配结果的无序列表。实现过程用到了os.scandir和fnmatch.fnmatch(),前者将文件路径输入列表,后者按规则匹配。匹配用到的主要通配符为 *, ? 和 []这三个,基本规则如下:
*: 匹配多个任意字符
?: 匹配1个任意字符
[]: 匹配[]中注明范围内的1个字符,如果要匹配特殊字符比如上面的*和?,用[*]和[?]即可
glob — Unix style pathname pattern expansion — Python 3.12.1 documentation
主要方法:
1) glob.glob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)
Return a possibly empty list of path names that match pathname, which must be a string containing a path specification.
这个方法返回一个列表,其中包含所有与指定模式匹配的文件路径。如果recursive参数为True,则会递归地搜索目录及其子目录。默认情况下,recursive参数为False。如果root_dir不为None,则返回的路径是相对于root_dir的相对路径。
2) glob.iglob(pathname, *, root_dir=None, dir_fd=None, recursive=False, include_hidden=False)
Return an iterator which yields the same values as glob() without actually storing them all simultaneously.
这个方法返回一个迭代器,其中包含所有与指定模式匹配的文件路径。如果recursive参数为True,则会递归地搜索目录及其子目录。默认情况下,recursive参数为False。如果root_dir不为None,则返回的路径是相对于root_dir的相对路径。
3) glob.escape(pathname)
这个方法将路径名中的特殊字符转义,以便在正则表达式中使用。例如,它会将
*
替换为\*
,将?
替换为\?
等。
以下是一个简单的示例:
import glob
# 查找当前目录下所有的.txt文件
txt_files = glob.glob('*.txt')
print(txt_files)
不足之处
glob模块只能做比较简单的匹配查询,不支持同时查询多个文件扩展名,比如.txt和.md文件,需要做2次查询,然后把2次结果进行合并,这样无形中降低了查询的效率。
使用案例
下面我们来看一些实际的使用案例:
查找当前目录下所有以a、b、c开头的目录
glob -d [abc]*
查找所有以.txt
结尾的文件
$ glob *.txt
file1.txt
file2.txt
file3.log
Python中使用glob模块查找当前目录的所有以.txt
结尾的文件
import glob
txt_files = glob.glob('*.txt')
print(txt_files)
Python中使用glob模块查找指定目录及其子目录下的所有以.txt 结尾的文件
import glob
txt_files = glob.glob('*.txt', root_dir='C:/ABC', recursive=True)
print(txt_files)