開発

Rustでディレクトリ構造を再帰的に取得する

前回のディレクトリ構造を取得するコマンドの別の解としてスクリプト等で取得することも可能かと思います。

環境によってはこういった十分なテストをしていないスクリプトの実行は禁止されていたり、許可を得る手間がかかる場合があるのであくまで参考です。(単にRustを学習したかったのでお題として作ったみたかっただけです)

use anyhow::Result;

#[macro_use]
extern crate clap;
use clap::Arg;

use std::fs;

fn main() -> Result<()> {
    let app = app_from_crate!().arg(
        Arg::with_name("dir")
            .short("d")
            .long("dir")
            .default_value(".")
            .help("target directory"),
    );

    let matches = app.get_matches();

    if let Some(dir) = matches.value_of("dir") {
        let dir_string = dir.to_string();
        println!("{}", dir_string);
        let _ = get_dirs(dir_string);
    }

    Ok(())
}

fn get_dirs(dir: String) -> Result<()> {
    let entries = fs::read_dir(dir)?;
    for entry in entries {
        let entry = entry?;
        let metadata = entry.metadata()?;
        let path = entry.path().display().to_string();

        if metadata.is_dir() {
            println!("{}", path);
            let _ = get_dirs(path.to_string());
            continue;
        }

        if let Ok(symlink) = fs::read_link(entry.path()) {
            if entry.path().is_dir() {
                println!("{}@ -> {}", path, symlink.display());
            }
        }
    }

    Ok(())
}

十分に作り込んでないですがfind コマンドぐらいのパフォーマンスが出ました。Rust、なかなかいいですね。

Tags: rust
管理人

Recent Posts

CanvaがSerif (Affinity) を買収

私は使ったことがないのですが名前はよく聞…

3週間 ago

Serifのスプリングセール – アドオンが50%オフ

Affinity Photoなどレタッチ…

1か月 ago

音声がロボットのようになるときの対処

リモート会議などでたまに相手の音声がおか…

2か月 ago

Serifのブラックフライデー – 全品40%オフ V1ユーザは更にお得!

恒例のブラックフライデーセールが始まりま…

5か月 ago

[rust] rayonで書き直してみました

前回のコードを元にrayonを使った処理…

5か月 ago

[rust] async-stdで書き直してみました

前回のコードをasync-stdで書き直…

6か月 ago