開発

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、なかなかいいですね。

管理人

Recent Posts

RustでSOLID原則について考える

binllionを作っていて1…

2か月 ago

[binllion] clippyを使ってコードを改善する

ここままでエディターとしての最…

3か月 ago

[binllion] データのエクスポート機能を追加する

インポートとくればエクスポート…

3か月 ago

[binllion] データのインポート機能を追加する

データの編集機能の開発も終えた…

3か月 ago

[binllion] 編集用バッファに削除機能を追加する

上書き、挿入、とくれば削除も必…

3か月 ago

[binllion] 編集用バッファに挿入機能を追加する

上書き、とくれば挿入も必要でし…

4か月 ago