11个版本
0.3.0 | 2023年10月9日 |
---|---|
0.2.4 | 2023年3月31日 |
0.2.1 | 2022年11月4日 |
0.2.0 | 2022年5月22日 |
0.1.1 | 2022年3月29日 |
#346 in 文件系统
1,546 每月下载量
在 8 个crates(7直接) 中使用
55KB
880 行
globmatch
Rust crate,用于根据指定目录解析glob。基于 globset 和 walkdir。
文档
有关glob格式的文档,请参阅
用法
将此添加到您的 Cargo.toml
[dependencies]
globmatch = "0.3"
示例和概念
对于CLI工具,操作一组文件通常是一种常见模式。这样的一组文件可以是直接提供的,作为工具的参数,也可以是通过配置文件提供的。
使用配置文件可以更容易地确定文件的位置,因为路径可以相对于配置指定。例如,以下 .json
输入
{
"globs": [
"../../../some/text-files/**/*.txt",
"other/inputs/*.md",
"paths/from/dir[0-9]/*.*"
]
}
在专门的配置文件中指定这些路径,可以在独立于操作这些文件的脚本的调用的情况下解析路径,配置文件的位置用作基本目录。此crate结合了现有crate globset 和 walkdir 的功能,以实现 相对glob匹配器。
示例:简单的匹配。
以下示例使用存储在 test-files/c-simple
文件夹中的文件,我们尝试使用glob test-files/c-simple/**/*.txt
(其中 test-files/c-simple
是唯一的相对路径组件)匹配所有 .txt
文件。
/*
Example files:
globmatch/test-files/c-simple/.hidden
globmatch/test-files/c-simple/.hidden/h_1.txt
globmatch/test-files/c-simple/.hidden/h_0.txt
globmatch/test-files/c-simple/a/a2/a2_0.txt
globmatch/test-files/c-simple/a/a0/a0_0.txt
globmatch/test-files/c-simple/a/a0/a0_1.txt
globmatch/test-files/c-simple/a/a0/A0_3.txt
globmatch/test-files/c-simple/a/a0/a0_2.md
globmatch/test-files/c-simple/a/a1/a1_0.txt
globmatch/test-files/c-simple/some_file.txt
globmatch/test-files/c-simple/b/b_0.txt
*/
use globmatch;
fn example_a() -> Result<(), String> {
let builder = globmatch::Builder::new("test-files/c-simple/**/*.txt")
.build(env!("CARGO_MANIFEST_DIR"))?;
let paths: Vec<_> = builder.into_iter()
.flatten()
.collect();
println!(
"paths:\n{}",
paths
.iter()
.map(|p| format!("{}", p.to_string_lossy()))
.collect::<Vec<_>>()
.join("\n")
);
assert_eq!(6 + 2 + 1, paths.len());
Ok(())
}
example_a().unwrap();
示例:指定选项和使用 .filter_entry
。
类似于在 globset 中使用 globset::GlobBuilder
的构建器模式,这个软件包允许向构建器传递选项(目前仅限大小写敏感)。
此外,可以从 walkdir 获取 filter_entry
函数,但只能作为一个单独的调用(此软件包未实现递归迭代器)。此函数允许在匹配提供的 glob 之前过滤文件和文件夹,因此可以有效地排除文件和文件夹,例如隐藏文件夹。
use globmatch;
fn example_b() -> Result<(), String> {
let root = env!("CARGO_MANIFEST_DIR");
let pattern = "test-files/c-simple/**/[ah]*.txt";
let builder = globmatch::Builder::new(pattern)
.case_sensitive(true)
.build(root)?;
let paths: Vec<_> = builder
.into_iter()
.filter_entry(|p| !globmatch::is_hidden_entry(p))
.flatten()
.collect();
assert_eq!(4, paths.len());
Ok(())
}
example_b().unwrap();
依赖项
~3–12MB
~125K SLoC