A few details: it doesn't recurse into existing subfolders, extensions are lowercased so you don't get png/ and PNG/ coexisting, and it handles name collisions by appending _1, _2, etc. rather than overwriting.
~150 lines of Rust, no dependencies outside of tempfile in dev.
cargo install --git https://github.com/timfinnigan/groupr groupr ~/Downloads --dry-run