開発

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(())
}
Code language: PHP (php)

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

管理人

Recent Posts

情報セキュリティマネジメント試験取得への道

スキルアップを図るべく情報セキ…

2か月 ago

ファイナンシャルプランナー3級試験取得への道

スキルアップを図るべくファイナ…

2か月 ago

[rust] New Type Patternを使ってみる

DDDの考えを取り入れることで…

5か月 ago

RustでDDDの要素を取り入れてみる

前回SOLID原則というものを…

5か月 ago

期間限定!書籍無料キャンペーン2025

「mdBookではじめるKin…

5か月 ago