| These are primarily notes|
It won't be complete in any sense.
It exists to contain fragments of useful information.
|This article/section is a stub — probably a pile of half-sorted notes, is not well-checked so may have incorrect bits. (Feel free to ignore, fix, or tell me)|
(See also comm)
diff is an utiliy to show the (minimal line-based) difference between two text files. In informal use it is useful to see where minor changes between files are.
Many prefer 'unified diff format' (-u parameter) over the default output format.
Its output can also be used by patch, to change another copy of the original file. This is used between programmers to distribute minor changes in code. In this context, it is quite helpful that diff lists its context, so more than one (non-conflicting) patch may be applied to the same file.
- git diff
- Yes, will work without any git metadata.
- Will color its output (if git is configured to).
- allows interactive merging
- wrapper around diff that colors the output.
- emacs's ediff-buffers
For example to show two different changes to an original version, which can be useful for conflict resolution in versioning systems.
Often to do binary patches (e.g. to save on data transfer), but also sometimes to see before/after versions of a file that got changed, e.g. in a hex-editor sort of viewer.
- Meld 
- Kompare (for KDE) 
- P4merge 
- Beyond Compare 
- kdiff3 
Difference in directory structure
...as in, check only the presence of files.
The shortest trick is probably:
rsync -navi dir1/ dir2/
- make sure -n is in there, or it will alter dir2 to match dir1
- the slashes matter (on the first, technically)
- This will use rsync's selection logic - i.e. is-same-timestamp-and-size.
- You may sometimes want --size-only, to look only at size and make mtime irrelevant.
- -i helps show how it's different
With content checks
The simplest graphical way is to use meld.
You could use diff itself - recursive, and ask it to just mention that files differ in contents:
diff -q -r dir1 dir2
Most other methods require more shell-fu, e.g.:
# diff -u 0 <( tree dir1 ) <( tree dir2 )
Or the three commands and temporary files:
tree dir1 > dir1tree tree dir2 > dir2tree diff dir1tree dir2tree