diff --git a/src/app.md b/src/app.md index 2bdd775..8129fe2 100644 --- a/src/app.md +++ b/src/app.md @@ -6,6 +6,7 @@ | [Unzip a tarball to a temporary directory][ex-tar-temp] | [![flate2-badge]][flate2] [![tar-badge]][tar] [![tempdir-badge]][tempdir] | [![cat-filesystem-badge]][cat-filesystem] [![cat-compression-badge]][cat-compression] | | [Recursively find duplicate file names][ex-dedup-filenames] | [![walkdir-badge]][walkdir] | [![cat-filesystem-badge]][cat-filesystem] | | [Recursively find all files with given predicate][ex-file-predicate] | [![walkdir-badge]][walkdir] | [![cat-filesystem-badge]][cat-filesystem] | +| [Recursively calculate file sizes at given depth][ex-file-sizes] | [![walkdir-badge]][walkdir] | [![cat-filesystem-badge]][cat-filesystem] | [ex-clap-basic]: #ex-clap-basic @@ -234,6 +235,35 @@ fn run() -> Result<()> { # quick_main!(run); ``` +[ex-file-sizes]: #ex-file-sizes + +## Recursively calculate file sizes at given depth + +Recursion depth can be flexibly set by [`WalkDir::min_depth`] & [`WalkDir::max_depth`] methods. +In this example we sum all file sizes to 3 subfolders depth, ignoring files in the root folder +at the same time. + +[![walkdir-badge]][walkdir] [![cat-filesystem-badge]][cat-filesystem] + +```rust +extern crate walkdir; + +use walkdir::WalkDir; + +fn main() { + let total_size = WalkDir::new(".") + .min_depth(1) + .max_depth(3) + .into_iter() + .filter_map(|entry| entry.ok()) // Files, we have access to + .filter_map(|entry| entry.metadata().ok()) // Get metadata + .filter(|metadata| metadata.is_file()) // Filter out directories + .fold(0, |acc, m| acc + m.len()); // Accumulate sizes + + println!("Total size: {} bytes.", total_size); +} +``` + [cat-command-line-badge]: https://badge-cache.kominick.com/badge/command_line--x.svg?style=social @@ -261,3 +291,5 @@ fn run() -> Result<()> { [`flate2::read::GzDecoder::new`]: https://docs.rs/flate2/0.2.19/flate2/read/struct.GzDecoder.html#method.new [`tar::Archive::unpack`]: https://docs.rs/tar/0.4.12/tar/struct.Archive.html#method.new [`tempdir::TempDir::new`]: https://docs.rs/tempdir/0.3.5/tempdir/struct.TempDir.html#method.new +[`WalkDir::min_depth`]: https://docs.rs/walkdir/*/walkdir/struct.WalkDir.html#method.min_depth +[`WalkDir::max_depth`]: https://docs.rs/walkdir/*/walkdir/struct.WalkDir.html#method.max_depth diff --git a/src/intro.md b/src/intro.md index 477e930..c9b9f8c 100644 --- a/src/intro.md +++ b/src/intro.md @@ -77,6 +77,7 @@ community. It needs and welcomes help. For details see | [Unzip a tarball to a temporary directory][ex-tar-temp] | [![flate2-badge]][flate2] [![tar-badge]][tar] [![tempdir-badge]][tempdir] | [![cat-filesystem-badge]][cat-filesystem] [![cat-compression-badge]][cat-compression] | | [Recursively find duplicate file names][ex-dedup-filenames] | [![walkdir-badge]][walkdir] | [![cat-filesystem-badge]][cat-filesystem] | | [Recursively find all files with given predicate][ex-file-predicate] | [![walkdir-badge]][walkdir] | [![cat-filesystem-badge]][cat-filesystem] | +| [Recursively calculate file sizes at given depth][ex-file-sizes] | [![walkdir-badge]][walkdir] | [![cat-filesystem-badge]][cat-filesystem] | ## [Logging](logging.html) @@ -203,6 +204,7 @@ Keep lines sorted. [ex-dedup-filenames]: app.html#ex-dedup-filenames [ex-file-post]: net.html#ex-file-post [ex-file-predicate]: app.html#ex-file-predicate +[ex-file-sizes]: app.html#ex-file-sizes [ex-global-mut-state]: basics.html#ex-global-mut-state [ex-hex-encode-decode]: encoding.html#ex-hex-encode-decode [ex-json-value]: encoding.html#ex-json-value