#pattern-matching #relative-path #glob-pattern #glob #pattern #file-path #search-pattern

globmatch

基于相对路径组件的跨平台glob匹配,通过从根目录递归迭代确定的候选路径列表进行匹配

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 文件系统

Download history 456/week @ 2024-03-13 326/week @ 2024-03-20 308/week @ 2024-03-27 357/week @ 2024-04-03 376/week @ 2024-04-10 299/week @ 2024-04-17 294/week @ 2024-04-24 300/week @ 2024-05-01 274/week @ 2024-05-08 279/week @ 2024-05-15 328/week @ 2024-05-22 316/week @ 2024-05-29 374/week @ 2024-06-05 429/week @ 2024-06-12 364/week @ 2024-06-19 327/week @ 2024-06-26

1,546 每月下载量
8 个crates(7直接) 中使用

自定义许可证

55KB
880

globmatch

Build status

Rust crate,用于根据指定目录解析glob。基于 globsetwalkdir

文档

https://docs.rs/globmatch

有关glob格式的文档,请参阅

https://docs.rs/globset

用法

将此添加到您的 Cargo.toml

[dependencies]
globmatch = "0.3"

示例和概念

对于CLI工具,操作一组文件通常是一种常见模式。这样的一组文件可以是直接提供的,作为工具的参数,也可以是通过配置文件提供的。

使用配置文件可以更容易地确定文件的位置,因为路径可以相对于配置指定。例如,以下 .json 输入

{
  "globs": [
    "../../../some/text-files/**/*.txt",
    "other/inputs/*.md",
    "paths/from/dir[0-9]/*.*"
  ]
}

在专门的配置文件中指定这些路径,可以在独立于操作这些文件的脚本的调用的情况下解析路径,配置文件的位置用作基本目录。此crate结合了现有crate globsetwalkdir 的功能,以实现 相对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