[Rust] Path에 glob이 없어서 외부 크레인의 glob과 globmatch를 사용해 봤습니다.

개시하다


파일을 수집할 때 Ruby가 있음Pathname.glob.
그러나 Rust의 Path는 glob이 없어서 실망했다.
그곳에서 외부 기중기에서 발견된 아래 두 개를 사용해 보았다.
  • glob
  • globmatch
  • 우선 목록은 다음과 같이 구성되어 있다.
    $ exa -T a
    a
    └── b
       └── c
          ├── 1.png
          ├── 2.png
          └── 3.PNG
    
    그나저나 이 exa는 Rust에서 만든 ls풍 도구로 경로에 일본어가 함유되어 있든 없든 나무에 이상하게 나타나지 않는다.
    일반 tree 명령에는 -N 옵션이 없으면 일본어가 표시되지 않습니다.cargo install exa를 통해exa를 설치할 수 있습니다.

    글로브 편


    간단한 사용법


    use glob::glob;
    
    let files = glob("a/**/*.png")
        .unwrap()
        .map(|e| e.unwrap())
        .collect::<Vec<_>>();
    
    println!("{:?}", files);
    // >> ["a/b/c/1.png", "a/b/c/2.png"]
    
    3.PNG가 나타나지 않은 것은 대소문자를 구분하기 때문이다.
    이럴 때 a/**/*.{png,PNG}라고 적으면 PNG와 일치할 수도 있지만 이동하지 않는다(왜?)

    대소문자 구별 중지


    use glob::glob_with;
    use glob::MatchOptions;
    
    let mut options = MatchOptions::new();
    options.case_sensitive = false; // false:大小文字の区別をしない
    
    let files = glob_with("a/**/*.png", options)
        .unwrap()
        .map(|e| e.unwrap())
        .collect::<Vec<_>>();
    
    println!("{:?}", files);
    // >> ["a/b/c/1.png", "a/b/c/2.png", "a/b/c/3.PNG"]
    
    case_sensitivefalse로 설정하면 png에서도 일치한다PNG를 알 수 있다.
    가능하면 case_sensitive: false를 초기값으로 설정해 주시기 바랍니다.

    globmatch 편


    간단한 사용법


    let files = globmatch::Builder::new("a/**/*.{png,PNG}")
        .build(".")
        .unwrap()
        .into_iter()
        .flatten()
        .collect::<Vec<_>>();
    
    // files は PathBuf の配列
    println!("{:?}", files);
    // >> ["./a/b/c/2.png", "./a/b/c/3.PNG", "./a/b/c/1.png"]
    
    여기도 대소문자 차이가 있지만 초기값a/**/*.{png,PNG}으로 쓸 수 있습니다!
    그런 점에서 이게 더 사용하기 쉬운 것 같아요.

    좋은 웹페이지 즐겨찾기