The Directory Differential hTool
DDH traverses input directories and their subdirectories. It also hashes files as needed and reports findings.
The H in "hTool" is silent. The H in its abbreviation, "DDH," is not.
This tool is called DDH for two very good reasons.
- DDT is a dangerous pesticide
- I mistyped when I created the project
DDH is usable both as a library and as a stand alone CLI tool and aims to be simple to use in both cases.
let (files, errors): (Vec<Fileinfo>, Vec<(_, _)>) = ddh::deduplicate_dirs(dirs); let (shared, unique): (Vec<&Fileinfo>, Vec<&Fileinfo>) = files .par_iter() .partition(|&x| x.get_paths().len()>1); process_full_output(&shared, &unique, &files, &errors, &arguments);
- Install Rust
cargo install --git https://github.com/darakian/ddh ddh
- The DDH binary will be installed into
$CARGO_HOME/.bin/ddh, which usually is
$HOME/.cargo/bin/ddh. This should be in your
PATHalready if you're using rustup.
DDH supports both a
standard output for human comprehension and a parsable
json output for custom tools such as ddh-move.
Directory Difference hTool Jon Moroney firstname.lastname@example.org Compare and contrast directories. Example invocation: ddh -d /home/jon/downloads /home/jon/documents -v duplicates Example pipe: ddh -d ~/Downloads/ -o no -v all -f json | someJsonParser.bin USAGE: ddh [OPTIONS] <Directories>... FLAGS: -h, --help Prints help information -V, --version Prints version information OPTIONS: -b, --blocksize <Blocksize> Sets the display blocksize to Bytes, Kilobytes, Megabytes or Gigabytes. Default is Kilobytes. [possible values: B, K, M, G] -f, --format <Format> Sets output format. [possible values: standard, json] -o, --output <Output> Sets file to save all output. Use 'no' for no file output. -v, --verbosity <Verbosity> Sets verbosity for printed output. [possible values: quiet, duplicates, all] ARGS: <Directories>... Directories to parse
How Does DDH Work?
DDH works by hashing files to determine their uniqueness and, as such, depends heavily on disk speeds for performance. The algorithmic choices in use are discussed here.