Rust文件路径匹配库nu-glob的使用,nu-glob提供高性能的glob模式匹配与文件遍历功能

Rust文件路径匹配库nu-glob的使用,nu-glob提供高性能的glob模式匹配与文件遍历功能

nu-glob是一个支持Unix shell风格文件路径模式匹配的Rust库。

使用方法

Cargo.toml中添加依赖:

[dependencies]
nu-glob = "0.60.0"

示例

打印/media/目录及其子目录中的所有jpg文件:

use nu_glob::glob;

for entry in glob("/media/**/*.jpg").expect("Failed to read glob pattern") {
    match entry {
        Ok(path) => println!("{:?}", path.display()),
        Err(e) => println!("{:?}", e),
    }
}

完整示例

下面是一个更完整的示例,展示如何使用nu-glob进行文件匹配和遍历:

use nu_glob::glob;
use std::path::Path;

fn main() {
    // 匹配当前目录下所有以".rs"结尾的文件
    let pattern = "./*.rs";
    
    // 使用glob进行匹配
    let entries = glob(pattern).expect("Failed to read glob pattern");
    
    println!("Files matching '{}':", pattern);
    
    // 遍历匹配结果
    for entry in entries {
        match entry {
            Ok(path) => {
                // 获取文件名
                if let Some(file_name) = path.file_name() {
                    println!("Found file: {}", file_name.to_string_lossy());
                    
                    // 检查文件类型
                    if path.is_file() {
                        println!("  - Type: File");
                    } else if path.is_dir() {
                        println!("  - Type: Directory");
                    }
                    
                    // 获取文件元数据
                    if let Ok(metadata) = path.metadata() {
                        println!("  - Size: {} bytes", metadata.len());
                    }
                }
            }
            Err(e) => println!("Error: {:?}", e),
        }
    }
    
    // 更复杂的模式匹配示例
    println!("\nRecursive search for markdown files:");
    for entry in glob("**/*.md").expect("Failed to read glob pattern") {
        if let Ok(path) = entry {
            println!("Found: {}", path.display());
        }
    }
}

功能特点

  • 支持Unix shell风格的glob模式匹配
  • 提供高性能的文件遍历功能
  • 支持递归匹配(**模式)
  • 简单易用的API

注意事项

  • 路径匹配是大小写敏感的(取决于操作系统)
  • 模式中的特殊字符需要进行转义处理
  • 对于大型目录结构,可能需要考虑性能优化

1 回复

Rust文件路径匹配库nu-glob使用指南

介绍

nu-glob是一个Rust库,提供了高性能的glob模式匹配和文件遍历功能。它特别适合需要高效处理文件系统路径匹配的场景,如构建工具、文件管理器或需要批量处理文件的应用程序。

主要特性

  • 支持标准glob模式语法
  • 高性能的文件系统遍历
  • 跨平台支持(Windows/Unix)
  • 支持递归目录遍历
  • 提供灵活的匹配选项

基本使用方法

添加依赖

首先在Cargo.toml中添加依赖:

[dependencies]
nu-glob = "0.6"

简单示例

use nu_glob::glob;

fn main() {
    // 匹配当前目录下所有的.rs文件
    for entry in glob("*.rs").expect("Failed to read glob pattern") {
        match entry {
            Ok(path) => println!("Matched: {:?}", path),
            Err(e) => println!("Error: {:?}", e),
        }
    }
}

递归匹配

use nu_glob::glob;

fn main() {
    // 递归匹配所有子目录中的.rs文件
    for entry in glob("**/*.rs").expect("Failed to read glob pattern") {
        if let Ok(path) = entry {
            println!("Found Rust file: {:?}", path);
        }
    }
}

高级用法

使用GlobBuilder进行更复杂的匹配

use nu_glob::{GlobBuilder, MatchOptions};

fn main() {
    let options = MatchOptions {
        case_sensitive: false,  // 不区分大小写
        require_literal_separator: false,
        require_literal_leading_dot: false,
    };

    let glob = GlobBuilder::new("**/*.[rR][sS]")
        .match_options(options)
        .build()
        .expect("Failed to create glob");

    for entry in glob {
        if let Ok(path) = entry {
            println!("Found: {:?}", path);
        }
    }
}

排除特定文件

use nu_glob::glob;

fn main() {
    // 匹配所有.rs文件,但排除test_开头的文件
    for entry in glob("**/[!test_]*.rs").expect("Failed to read glob pattern") {
        if let Ok(path) = entry {
            println!("Matched (excluding tests): {:?}", path);
        }
    }
}

获取绝对路径

use nu_glob::glob;
use std::path::PathBuf;

fn main() {
    for entry in glob("src/**/*.rs").expect("Failed to read glob pattern") {
        if let Ok(path) = entry {
            let absolute_path = PathBuf::from(".").join(path).canonicalize().unwrap();
            println!("Absolute path: {:?}", absolute_path);
        }
    }
}

完整示例演示

以下是一个结合多种功能的完整示例:

use nu_glob::{GlobBuilder, MatchOptions};
use std::path::PathBuf;

fn main() {
    // 配置匹配选项
    let options = MatchOptions {
        case_sensitive: false,
        require_literal_separator: false,
        require_literal_leading_dot: false,
    };

    // 构建glob模式
    let glob = GlobBuilder::new("src/**/[!test_]*.rs")
        .match_options(options)
        .build()
        .expect("Failed to create glob");

    println!("匹配结果:");
    println!("=========");

    // 遍历匹配结果
    for entry in glob {
        if let Ok(path) = entry {
            // 获取绝对路径
            let absolute_path = PathBuf::from(".").join(&path).canonicalize().unwrap();
            
            // 打印结果
            println!("相对路径: {:?}", path);
            println!("绝对路径: {:?}", absolute_path);
            println!("---");
        }
    }
}

性能提示

  1. 对于大量文件匹配,考虑使用GlobBuilder预编译模式
  2. 尽可能缩小匹配范围(避免过于宽泛的**模式)
  3. 重用编译后的glob模式进行多次匹配

nu-glob提供了强大而灵活的文件路径匹配功能,是处理文件系统操作的理想选择。

回到顶部