#gitignore #glob #fnmatch

pathmatch

fnmatch 函数的改进版本,支持类似 ** 的模式,如 .gitignore

1 个不稳定版本

使用旧的 Rust 2015

0.1.2 2014年11月24日

文件系统 中排名 1489

MIT 许可证

16KB
348 行(不包括注释)

pathmatch:更好的 fnmatch

这是一个开发改进替代 POSIX fnmatch 函数的实验。例如,在实现类似 .gitignore 的功能时可以使用它。

模块接口目前是一个全局函数,没有额外的选项

pub fn pathmatch(pattern: &str, pathstring: &str) -> bool

注意:此实现并不完全符合实际的 .gitignore,并包含更多功能(例如 {} 模式)。

快速了解这个想法

*.txt 匹配不带路径的文件名,如果它们以 “.txt” 结尾

one.txt
two.txt

**.txt 匹配任何以 “.txt” 结尾的路径

one.txt
two.txt
foo/3.txt
foo/bar/4.txt

**/build/** 将匹配包含 “build” 文件夹的任何路径,包括裸字符串 build 本身。

**/build/{Debug,Release} 匹配最后两个文件夹是 build/Debugbuild/Release 的路径

build/Debug
build/Release
subproject1/build/Debug
subproject1/build/Release

换句话说,**/ 可能匹配路径字符串的开始,/** 可能匹配路径字符串的末尾,而 /**/ 可能匹配单个路径分隔符(/)。要禁用此行为,明确要求在之前/之后存在某些内容:*/**/build/{Debug,Release}*/**/build/**/*

也支持通配符 ?,它匹配除了路径分隔符之外的单个字符。

pmfind 命令行工具

您可以使用包含的 pmfind 工具来测试 pathmatch() 在实际应用中的效果

  $ ./pmfind '{*.rs,Makefile}' '**/{logs,master}'
pmfind.rs
pathmatch.rs
Makefile
.git/refs/remotes/origin/master
.git/refs/heads/master
.git/logs
.git/logs/refs/remotes/origin/master
.git/logs/refs/heads/master

用法

Usage:
        ./pmfind [options] [pattern ...]

Options:
    -C --dir dir        change directory to this before starting
    -h --help           print help and exit

如果模式以 ! 开头,pmfind 会从输出中排除匹配该模式的路径,否则会打印这些路径。模式按照在命令行中出现的顺序应用,因此最后匹配的结果决定了路径是否会被打印。没有任何模式匹配的路径永远不会被打印。例如

  $ ./pmfind '**/master'
.git/refs/remotes/origin/master
.git/refs/heads/master
.git/logs/refs/remotes/origin/master
.git/logs/refs/heads/master

  $ ./pmfind '**/master' '!**/logs/**'
.git/refs/remotes/origin/master
.git/refs/heads/master

  $ ./pmfind '**/master' '!**/logs/**' '**/logs/refs/heads/master'
.git/refs/remotes/origin/master
.git/refs/heads/master
.git/logs/refs/heads/master

无运行时依赖