Usage:

zzdiff [ option ] ... file1 file2
Show contents differences between file1 and file2 in DIFF format. The "path" (relevant, e.g., for the "--path" command line option, see below) is "" (the empty string).
zzdiff [ option ] ... dir1 dir2
Show which files were added (missing in dir1) or deleted (missing in dir2) and their subdirectories, and any contents differences for the remaining files in DIFF format. The "path" (relevant, e.g., for the "--path" command line option, see below) is relative to dir1, e.g. "file.txt" or "subdir/file.zip!dir/file.txt" or "archive.tgz%!dir/file.txt" or "dir/file.Z%".

The default output format is the "normal format", also known as the "traditional format". Other output formats can be chosen through command line options, see "Output generation", below.

Options:

General

--help
Print this text and terminate.

File selection

--path path-predicate
Process only matching files/entries, e.g."dir/file.zip!dir/file" or "**/file". See also "Globs", below.
--look-into format-glob:path-glob
Look into compressed and archive contents if its format matches format-glob and its path matches the path-glob. The default is to look into any recognised archive or compressed contents.
Supported archive formats in this runtime configuration are:
${archive.formats}
Supported compression formats in this runtime configuration are:
${compression.formats}
--path-equivalence path-regex
--pe path-regex
Files with different names map iff their names match the path-regex and all capturing groups are equal. May be given more than once.
--ne path-regex
Deprecated - Equivalent with "--path-equivalence path-regex".
--no-recurse-subdirctories
Don't recurse through subdirectories; just compare the existence of subdirectories.

Content processing

--disassemble
--da
Disassemble .class files.
--da-no-lines
When disassembling .class files, don't display lines debug info.
--da-no-vars
When disassembling .class files, don't display local variables debug info.
--line-equivalence path-pattern line-regex
Lines in files path-pattern that contain line-regex and all capturing groups are equal are regarded as equal.
--ignore path-pattern line-regex
-I path-pattern line-regex
Ignore differences in files path-pattern where all lines (deleted, changed or added) match the given line-regex.
--ignore-whitespace
-w
Ignore whitespace differences.
--added-file mode
--deleted-file mode
How to deal with added resp. deleted files:
REPORT (the default):
Print "File added path", resp. "File deleted path" (or, with "--exist" or "--brief", print "+ path" resp. "- path").
COMPARE_WITH_EMPTY:
Generate a diff document by comparing with the empty document.
IGNORE:
Do nothing.
--new-file
-N
Treat absent files as empty. This is shorthand for "--added-file COMPARE_WITH_EMPTY --deleted-file COMPARE_WITH_EMPTY".
--unidirectional-new-file
Treat added files as (previously) empty; deleted files are only reported. This is shorthand for "--added-file COMPARE_WITH_EMPTY --deleted-file REPORT".
--unchanged-files
Also report unchanged files.
--encoding charset-name
Encoding of the files being compared (defaults to the JVM default charset, "${file.encoding}").

Output generation

--out output-file
Write DIFF to output-file instead of STDOUT.
--normal
Output "normal diff format"; this is the default.
--exist
Report only which files were added or deleted (do not report changed content).
--brief
-q
Report only which files were added, deleted or changed.
--context
-c
Output "context diff format" with three lines of context.
--Context amount
-C amount
Output "context diff format" with amount lines of context.
--unified
-u
Output "unified diff format" with three lines of context.
--Unified amount
Output "unified diff format" with amount lines of context.
--keep-going
Report errors and continue with next file.
--sequential
Scan directories strictly sequentially. The default is to parallelize the directory scan in multiple threads.
--java-tokenization
Regard documents as streams of Java tokens; the whitespace between tokens (including line breaks) is then insignificant.
--ignore-c-style-comments
Don't regard C-style comments ("/* ... */") as relevant for comparison.
--ignore-c++-style-comments
Don't regard C++-style comments ("// ...") as relevant for comparison.
--ignore-doc-comments
Don't regard doc comments ("/** ... */") as relevant for comparison.
--no-warn
Suppress all output except errors.
--quiet
Suppress "normal" output; print only errors and warnings.
--verbose
Print verbose messages.
--debug
Print verbose and debug messages.

Globs

A glob can have the form

   *~*.c~*.h~foo.c

, which means "foo.c plus all that don't end with .c or .h".

Example globs:

dir/file
File "file" in directory "dir".
file.gz%
Compressed file "file.gz".
file.zip!dir/file
Entry "dir/file" in archive file "dir/file.zip".
file.tar.gz%!dir/file
Entry "dir/file" in the compressed archive file "file.tar.gz".
*/x
File "x" in an immediate subdirectory.
**/x
File "x" in any subdirectory.
***/x
File "x" in any subdirectory, or any entry "**/x" in any archive file in any subdirectory.
a,dir/file.7z!dir/b
File "a" and entry "dir/b" in archive file "dir/file.7z".
~*.c
Files that don't end with ".c".
~*.c~*.h
Files that don't end with ".c" or ".h".
~*.c~*.h,foo.c
"foo.c" plus all files that don't end with ".c" or ".h".