diff - display differences between two files (or directories)

diff [options] old-file new-file

Use - to read from standard input.

diff directory file
  Compares the corresponding file in directory . The non-directory file must not be - .

diff directory directory
 Compares corresponding files in both directories, in alphabetical order.
This comparison is not recursive unless the -r or ‑‑recursive option is given.

diff never compares the actual contents of a directory as if it were a file. The file that is fully specified may not be standard input, because standard input is nameless and the notion of "file with the same name" does not apply.

Use -- to terminate options when specifing file names which begin with a -.

Multiple single letter options can be combined (example: ‑wyW50)

options to ignore "insignificant" differences
-i
--ignore-case
 
-B
--ignore-blank-lines
Ignore differences that just insert or delete Blank lines.
-b
--ignore-space-change
Ignore differences in amount of blanks.
-w
--ignore-all-space
Ignore white space when comparing lines.
-I regexp
--ignore-matching-lines= regexp
Ignore differences that just insert or delete lines that match regexp.
Option affecting amount of output
-q
--brief
quite Do not show differences.
Only whether the files differ, not the details of the differences.
Display "Files old-file and new-file differ" or nothing if the files are the same.

See cmp for "quiter". Check the return code $?

if [ $? -gt 0  ]; then 
     echo -n  $'\a '
 fi 
-t
--expand-tabs
to spaces in the output, preserves the alignment of tabs in the input files.
-T
--initial-tab
Output a Tab rather than a space before the text of a line in normal or context format, causes the alignment to look normal.
--side-by-side
-y
  diff -y dfdf dfdf_1
Avail   Mounted                                                 Avail   Mounted
695M    /                                                       695M    /
170M    /Volumes/DATA                                           170M    /Volumes/DATA
56K     /Volumes/BACKUP_2                                       56K     /Volumes/BACKUP_2
919M    /Volumes/TBD                                          | 898M    /Volumes/TBD
xxxx                                                            xxxx
-W columns
--width=columns
diff -W70 --side-by-side dfdf dfdf_1
Avail   Mounted                         Avail   Mounted
695M    /                               695M    /
170M    /Volumes/DATA                   170M    /Volumes/DATA
56K     /Volumes/BACKUP_2               56K     /Volumes/BACKUP_2
919M    /Volumes/TBD              |     898M    /Volumes/TBD
xxxx                                    xxxx
--suppress-common-lines
diff  -wyW$COLUMNS --su    dfdf dfdf_1
diff -yW50 --suppress dfdf dfdf_1 
919M    /Volumes/TBD                                         | 898M    /Volumes/TBD
--leftcolumn only
diff -yW60 --left dfdf dfdf_1
Avail   Mounted              (
695M    /                    (
170M    /Volumes/DATA        (
56K     /Volumes/BACKUP_2    (
919M    /Volumes/TBD         |  898M    /Volumes/TBD
xxxx                         ( 

When comparing directories:
-s
--report-identical-files
Report are identical when files are the same,
     otherwise no output is produced.
-x pattern
--exclude=pattern
ignore files and subdirectories whose basenames match pattern.
--exclude-from=file ignore files and subdirectories whose basenames match any pattern in file.
-X file ignore files and subdirectories whose basenames match any pattern contained in file.
-r
--recursive
compare subdirectories .
-N
--new-file
a file found in only in one directory is compared to an empty file.
-P
--unidirectional-new-file
a file occuring only in the second directory id compared to an empty file.
-S file
--starting-file=file
start with the file file. Use for resuming an aborted comparison.
--horizon-lines=lines Do not discard the last lines lines of the common prefix and the first lines lines of the common suffix.
--from-file= file Compare file to all operands. file can be a directory.
--to-file= file Compare all operands to file. file can be a directory.
-l --paginate Pass the output through pr to paginate it.

-a --text Treat all files as ASCII text and compare them line-by-line, even if they do not seem to be text.

-v
--version

Show the differences with some lines before and after the differences.

  -c Use the context output format
  -C lines
--context=lines. Show lines of context. Default 3.

diff  -c dfdf1 dfdf2
*** dfdf1 Tue Sep  5 18:10:15 2006  ← mod date of file prefixed with stars 
--- dfdf2 Tue Sep  5 18:10:24 2006
***************  ← seperator
*** 4,7 **** ← position (column,line) where difference starts in dfdf1
  1.3G  /Volumes/PHOTOS_1
  2.7G  /Volumes/PHOTOS_2
  56K   /Volumes/BACKUP_2
! 919M  /Volumes/TBD
 ↖ position where difference starts
----4,7 ---- ← position (column,line) where difference starts in dfdf2
  1.3G  /Volumes/PHOTOS_1
  2.7G  /Volumes/PHOTOS_2
  56K   /Volumes/BACKUP_2
! 898M  /Volumes/TBD 
  -e
--ed Make output that is a valid ed script.
7c
898M    /Volumes/TBD
.

  -f
--forward-ed Make output that looks vaguely like an ed script but has changes in the order they appear in the file.

diff  -f dfdf dfdf_1
c7
898M    /Volumes/TBD
.

  -F regexp In context and unified format for each hunk of differences, show some of the last preceding line that matches regexp.

  -n
--rcs Output RCS-format(Revision Control Systems) diffs; like -f except that each command specifies the number of lines affected.

diff  -n dfdf dfdf_1
d7 1
a7 1
898M    /Volumes/TBD

  -L label
--label=label Use label instead of the file name in the context and unified format headers.

-D name
--ifdef=name Make merged if-then-else format output, conditional on the preprocessor macro name.

--line-format=format Use format to output all input lines in in-then-else format.

%L contents of line %l , excluding any trailing newline
%[-]*[width][.[prec*{doxX}*n printf-style spec for input line number
%% the % character
x the single character x (i.e. any character)
%c'\OOO' the character with octal code OOO
diff --line-format="%8dn  %L" dfdf dfdf_1
       1  Avail Mounted
       2  695M  /
       3  170M  /Volumes/DATA
       4  1.3G  /Volumes/PHOTOS_1
       5  2.7G  /Volumes/PHOTOS_2
       6  56K   /Volumes/BACKUP_2
       7  919M  /Volumes/TBD
       7  898M  /Volumes/TBD
       8  xxxx
--old-line-format=format... a line taken from just the first file
--new-line-format=format ...a line taken from just the second file
--unchanged-line-format=format ... a line common to both files

% lines from FILE1
%> lines from FILE2
%= lines common to FILE1 and FILE2
%% %
%c'C' the single character C
%c'\OOO' the character with octal code OOO
%[-][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
--changed-group-format=format Use format to output a line group containing differing lines from both files
--old-group-format=format ... the first file
--new-group-format=format ...the second
--unchanged-group-format=format ... of common lines from both files

-u Use the unified output format.
-U lines
--unified[=lines]
Use the unified output format, showing lines of context. default 3.
#cat 0

Avail   Mounted
10632   /
791     /Volumes/DATA
560     /Volumes/PHOTOS
3504    /Volumes/BACKUPS
4542    /Volumes/linux
934     /Volumes/SWAP
#cat 00

Avail   Mounted
10639   /
791     /Volumes/DATA
560     /Volumes/PHOTOS
3504    /Volumes/BACKUPS
4542    /Volumes/linux
934     /Volumes/SWAP

diff -u 0 00
--- 0   2007-01-14 21:07:11.000000000 -0500
+++ 00  2007-01-14 21:15:54.000000000 -0500
@@ -1,5 +1,5 @@
 Avail  Mounted
-10632  /
+10639  /
 791    /Volumes/DATA
 560    /Volumes/PHOTOS
 3504   /Volumes/BACKUPS

-p
--show-c-function
--show-function-line=regexp In context and unified format, for each hunk of differences, show some of the last preceding line that matches regexp.

--sdiff-merge-assist Print extra information to help sdiff. sdiff uses this option when it runs diff. This option is not intended for users to use directly.

-d --minimal Change the algorithm to perhaps find a smaller set of changes. slower (sometimes much slower).
-H
--speed-large-files Use Heuristics to speed handling of large files that have numerous scattered small changes.

See

cmp , comm, diff3, ed, patch, pr, sdiff.

Diagnostics

exit status
0 no differences were found,
1 some differences were found
2 means trouble ( binary file mismatch, file not found/accessible,...).


cmp options file1 file2

-b
--print-bytes
output differing bytes.
file1 file2 differ: byte 1232, line 38 is 
 164 t  
163 s


file1


file2
-i SKIP
--ignore-initial=SKIP
Skip the first SKIP bytes of input.
-i SKIP1:SKIP2
--ignore-initial=SKIP1:SKIP2
Skip the first SKIP1 bytes of FILE1 and the first bytes of FILE2.
-l
--verbose
Output byte numbers and values of all differing bytes.
-n LIMIT
--bytes=LIMIT
Compare at most LIMIT bytes.
-s
--quiet
--silent
Output nothing; test the return value
-v
--version
--help
Return values: 0 - files are identical; 1 - files differ; 2 - inaccessible or missing argument


comm [OPTION]... FILE1 FILE2

Compare sorted files FILE1 and FILE2 line by line displaying lines in common.

With no options, produce three-column output.
first Column contains lines unique to FILE1,
second column contains lines unique to FILE2 and
last column contains lines common to both files.

-1 suppress lines unique to FILE1 (first column)
-2 suppress lines unique to FILE2 (secondcolumn)
-3 suppress lines that appear in both files (last column)

--help
--version output version information and exit

> cat 1
aaaaaaaaa
bbbbbbbb
ccccccc
> cat 2
aaaaaaaaa
b222bbbb
ccccccc
> comm 1 2
                aaaaaaaaa
        b222bbbb
bbbbbbbb
                ccccccc

sdiff - side-by-side merge of file differences sdiff [option]... file1 file2

Side-by-side merge of file differences.

Ignore minor differences
-i
--ignore-case
 
-E
--ignore-tab-expansion
due to tab expansion.
-b
--ignore-space-change
amount of white space.
-W
--ignore-all-space
all white space.
-B
--ignore-blank-lines
are all blank.
-I RE
--ignore-matching-lines=RE
matching RE.
--strip-trailing-cr Strip trailing carriage return on input.
-a
--text
Treat all files as ASCII text.
output controls
-w NUM
--width=NUM
at most NUM (default 130) columns per line.
-l
--left-column
only the left column of common lines.
-s
--suppress-common-lines
 
-t
--expand-tabs
Expand tabs to spaces in output.
Performace
-d
--minimal
Try hard to find a smaller set of changes.
-H
--speed-large-files
Assume large files and many scattered small changes.
-o FILE
--output=FILE
output to FILE.
--diff-program=PROGRAM Use PROGRAM to compare files.
-v
--version

--help

If a FILE is `-', read standard input.

diff aka top