開発

[rust] ディレクトリを再帰処理するcrate

以前にディレクトリを再帰処理してディレクトリとシンボリックリンクを表示するプログラムを書きましたが、crate.ioを眺めていると同じような処理をするcrateが既にありました。

walkdir crateというもので、以前のコードを書き換えてこちらのcrateを試してみました。ripgrepの作者の方のcrateですね。

use clap::Parser;
use std::fs;
use std::io::Error;
use walkdir::WalkDir;

#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
    /// target directory
    #[arg(short, long, default_value_t = String::from("./dir") )]
    dir: String,
}

fn main() -> Result<(), Error> {
    let args = Args::parse();
    let dir_string = args.dir.to_string();

    for entry in WalkDir::new(dir_string) {
        let entry = entry?;
        let file_type = entry.file_type();
        let path = entry.path();

        if file_type.is_dir() {
            println!("{}", path.display());
        }

        if entry.path_is_symlink() {
            println!(
                "{}@ -> {}",
                path.display(),
                fs::read_link(path).unwrap().display()
            );
        }
    }

    Ok(())
}

Code language: Rust (rust)
TOML
[dependencies]
clap = { version = "4.5.29", features = ["derive"] }
walkdir = "2.5.0"

./dirに下記のようにテスト用のディレクトリ構造を作っています。

a -> aaa
aaa
b -> bbb
bbb
c -> ccc
ccc

実行した結果がこちらです。

./dir
./dir/a@ -> aaa
./dir/c@ -> ccc
./dir/b@ -> bbb
./dir/aaa
./dir/ccc
./dir/bbb

コード量はあまり変わらないですが、単純な処理は楽して書けそうなので良いかもしれません。

また、以前のtokio版ディレクトリ再帰的取得のプログラムのように非同期に取得する動作と思われるasync-walkdir crateやjwalk crate、Linuxだと早く動作しそうなfts crateなど様々な選択肢があるので試してみるのもいいかもしれません。

管理人

Recent Posts

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

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

2か月 ago

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

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

2か月 ago

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

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

5か月 ago

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

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

5か月 ago

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

「mdBookではじめるKin…

5か月 ago