Search notes:

Shell command: diff

Compare files line by line.

Command line options

Some interesting options, IHMO, include
-y Side by side (output is shown in two columns). Long option is --side-by-side.
-Z Ignore trailing whitespace. This is useful if diffing files that have been saved in Unix and Windows because of their differing end of line bytes. Long options --ignore-trailing-space
-q Report only if file differs. This is especially useful when used in conjunction with -r. Long option is --brief
-r Compare a directory tree, rather than a single file. I like to combine -r with -q so that I simply see which files have changed or were added (or deleted). Long option is --recursive
Other options are
--normal output a normal diff (the default)
-s --report-identical-files report when two files are the same
-c, -C --context [NUM] output NUM (default 3) lines of copied context
-u, -U --unified [NUM] output NUM (default 3) lines of unified context
-e --ed output an ed script
-n --rcs output an RCS format diff
-W --width=NUM output at most NUM (default 130) print columns
--left-column output only the left column of common lines
--suppress-common-lines do not output common lines
-p --show-c-function show which C function each change is in
-F --show-function-line= RE show the most recent line matching RE
--label LABEL use LABEL instead of file name and timestamp (can be repeated)
-t --expand-tabs expand tabs to spaces in output
-T --initial-tab make tabs line up by prepending a tab
--tabsize= NUM tab stops every NUM (default 8) print columns
--suppress-blank-empty suppress space or tab before empty output lines
-l --paginate pass output through 'pr' to paginate it
--no-dereference don't follow symbolic links
-N --new-file treat absent files as empty
--unidirectional-new-file treat absent first files as empty
--ignore-file-name-case ignore case when comparing file names
--no-ignore-file-name-case consider case when comparing file names
-x --exclude=PAT exclude files that match PAT
-X --exclude-from= FILE exclude files that match any pattern in FILE
-S --starting-file=FILE start with FILE when comparing directories
--from-file= FILE1 compare FILE1 to all operands; FILE1 can be a directory
--to-file= FILE2 compare all operands to FILE2; FILE2 can be a directory
-i --ignore-case ignore case differences in file contents
-E --ignore-tab-expansion ignore changes due to tab expansion
-b --ignore-space-change ignore changes in the amount of white space
-w --ignore-all-space ignore all white space
-B --ignore-blank-lines ignore changes where lines are all blank
-I --ignore-matching-lines= RE ignore changes where all lines match RE
-a --text treat all files as text
--strip-trailing-cr strip trailing carriage return on input
-D --ifdef=NAME output merged file with '#ifdef NAME' diffs
--GTYPE-group-format= GFMT format GTYPE input groups with GFMT
--line-format= LFMT format all input lines with LFMT
--LTYPE-line-format= LFMT
-d --minimal try hard to find a smaller set of changes
--horizon-lines= NUM keep NUM lines of the common prefix and suffix
--speed-large-files assume large files and many scattered small changes
--color= [WHEN] colorize the output; WHEN can be never, always or auto (the default)
--palette= PALETTE the colors to use when --color is active; PALETTE is a colon-separated list of terminfo capabilities
--help display this help and exit
-v --version output version information and exit

LTYPE format (LFMT)

These format options provide fine-grained control over the output of diff, generalizing -D/--ifdef.
LTYPE is old, new or unchanged.
GTYPE is LTYPE or 'changed'.
GFMT (only) may contain:
%< lines from FILE1
%> lines from FILE2
%= lines common to FILE1 and FILE2
%[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER
LETTERs are as follows for new group, lower case for old group:
F first line number
L last line number
N number of lines = L-F+1
E F-1
M L+1
%(A=B?T:E) if A equals B then T else E
LFMT (only) may contain:
%L contents of line
%l contents of line, excluding any trailing newline
%[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number
Both GFMT and LFMT may contain:
%% %
%c'C' the single character C
%c'\OOO' the character with octal code OOO
C the character C (other characters represent themselves)

Comparing the output of two programs

Process substitution allows to compare the output of two programs. The following example compares the directory and file names in two directories:
$ diff <( ls -1 ~/dir-one )  <( ls -1 ~/dir-two )

Coloring differences

The --color=always option causes the output to be colored in red (deleted lines) and green (added lines).
Unfortunately, it does not work with the -y option.
git diff is similar to using diff --color=always, yet it allows to add --word-diff to highlight changes on one line.
colordiff is a Perl script that colors the output of diff.

diff.exe on Windows

Unfortunately, it seems there is no diff.exe on Windows, by default.
However, when Git is installed, there is also a diff whose path can be set in PowerShell like so. The first line must be used if only one git executable is found in the path, the second one if multiple are found:
$env:path = "$( split-path (where.exe git)   )\..\usr\bin;$env:path"
$env:path = "$( split-path (where.exe git)[0])\..\usr\bin;$env:path"
Because diff is also an alias for compare-object, the diff executable must be explicitly invoked with the .exe suffix. Thus, this alias should (probably) be deleted:
remove-item alias:diff -force

See also

The Shell commands patch and cmp
The Perl module Text::Diff::FormattedHTML.
The Windows command fc.exe
https://github.com/ReneNyffenegger/shell-commands/tree/master/diff

Index