du - disk usage



examples/files/du/src/main.rs
use std::path::Path;
use std::process::exit;

// get path on the command line
// traverse the directory tree

fn main() {
    let args: Vec<String> = std::env::args().collect();
    let path = if args.len() == 1 { Path::new(".") } else { Path::new(&args[1]) };
    if ! path.exists() {
        eprintln!("given path '{:?}' does not exist", path);
        exit(1);
    }

    let total = get_total(path);
    println!("Total: {}", total);
}

fn get_total(path: &Path) -> u64 {
    //dbg!(path);

    let mut total: u64 = 0;
    if path.is_dir() {
        for entry in path.read_dir().expect("read_dir call failed").flatten() {
            total += get_total(&entry.path());
        }
        return total
    }

    match std::fs::metadata(path) {
        Ok(meta) => {
            println!("{:?} {:?}", meta.len(), path);
            meta.len()
        },
        Err(_) => {
            eprintln!("Error in {:?}", path);
            0
        },
    }
}