前回のディレクトリ構造を取得するコマンドの別の解としてスクリプト等で取得することも可能かと思います。
環境によってはこういった十分なテストをしていないスクリプト(というかコード)の実行は禁止されていたり、許可を得る手間がかかる場合があるのであくまで参考です。(単に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、なかなかいいですね。