Skip to content

Instantly share code, notes, and snippets.

@kujirahand
Created August 19, 2024 07:51
Show Gist options
  • Save kujirahand/a3bf32400668c0fe7b789c91ef4d659c to your computer and use it in GitHub Desktop.
Save kujirahand/a3bf32400668c0fe7b789c91ef4d659c to your computer and use it in GitHub Desktop.
再帰的にファイル検索を行うプログラム
use wildcard_ex::is_match;
fn main() {
// コマンドライン引数を取得 --- (*1)
let args: Vec<String> = std::env::args().collect();
// 引数が1つ以上あるかチェック
if args.len() < 2 {
// 引数が1つもない場合はエラーメッセージを表示して終了
eprintln!("Usage: {} [-r] <検索パターン>", args[0]);
std::process::exit(1);
}
// 引数に "-r"があれば、再帰的に検索する --- (*2)
let mut recursive = false;
let pattern = if &args[1] == "-r" {
recursive = true;
&args[2] // パターンを得る --- (*3)
} else { &args[1] };
// パターンに合うファイル一覧を取得 --- (*4)
let files = enum_files(".", pattern, recursive);
for file in files {
println!("[発見] {}", file);
}
}
// 再帰的にファイルを列挙する関数 --- (*5)
fn enum_files(dir: &str, pattern: &str, recursive: bool) -> Vec<String> {
let mut files = vec![];
let entries = std::fs::read_dir(dir).unwrap(); // 一覧を取得
for entry in entries {
let entry = entry.unwrap();
let path = entry.path();
if path.is_dir() { // ディレクトリの場合 --- (*6)
if recursive { // 再帰的に検索
let mut subfiles = enum_files(
&path.to_string_lossy(), pattern, recursive);
files.append(&mut subfiles);
}
continue;
}
// ファイル名を取得してパターンにマッチするかチェック --- (*7)
let fname = entry.file_name().to_string_lossy().to_string();
if pattern == "" || is_match(pattern, &fname) {
files.push(entry.path().to_string_lossy().to_string());
}
}
files
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment