The
diff
utility compares the contents of
file1
and
file2
and writes to the standard output the list of changes necessary to
convert one file into the other.
No output is produced if the files are identical.
Output options (mutually exclusive):
-C number
Like
-c
but produces a diff with
number
lines of context.
-c
Produces a diff with 3 lines of context.
With
-c
the output format is modified slightly:
the output begins with identification of the files involved and
their creation dates and then each change is separated
by a line with fifteen
* .
The lines removed from
file1
are marked with
\&-\ \&;
those added to
file2
are marked
\+\ \&.
Lines which are changed from one file to the other are marked in
both files with
!\ \&.
Changes which lie within 3 lines of each other are grouped together on
output.
-D string
Creates a merged version of
file1
and
file2
on the standard output, with C preprocessor controls included so that
a compilation of the result without defining
string
is equivalent to compiling
file1,
while defining
string
will yield
file2.
-e
Produces output in a form suitable as input for the editor utility,
ed(1),
which can then be used to convert file1 into file2.
Extra commands are added to the output when comparing directories with
-e,
so that the result is a
sh(1)
script for converting text files which are common to the two directories
from their state in
dir1
to their state in
dir2.
-f
Identical output to that of the
-e
flag, but in reverse order.
It cannot be digested by
ed(1).
-n
Produces a script similar to that of
-e,
but in the opposite order and with a count of changed lines on each
insert or delete command.
This is the form used by
rcsdiff(1).
-q
Just print a line when the files differ.
Does not output a list of changes.
-U number
Like
-u
but produces a diff with
number
lines of context.
-u
Produces a
unified
diff with 3 lines of context.
A unified diff is similar to the context diff produced by the
-c
option.
However, unlike with
-c,
all lines to be changed (added and/or removed) are present in
a single section.
Comparison options:
-a
Treat all files as
ASCII
text.
Normally
diff
will simply print
Binary files ... differ
if files contain binary characters.
Use of this option forces
diff
to produce a diff.
-b
Causes trailing blanks (spaces and tabs) to be ignored, and other
strings of blanks to compare equal.
-d
Try very hard to produce a diff as small as possible.
This may consume a lot of processing power and memory when processing
large files with many changes.
-I pattern
Ignores changes, insertions, and deletions whose lines match the
extended regular expression
pattern.
Multiple
-I
patterns may be specified.
All lines in the change must match some pattern for the change to be
ignored.
See
re_format(7)
for more information on regular expression patterns.
-i
Ignores the case of letters.
E.g.,
A
will compare equal to
a.
-L label
Print
label
instead of the first (and second, if this option is specified twice)
file name and time in the context or unified diff header.
-l
Long output format; each text file
diff
is piped through
pr(1)
to paginate it;
other differences are remembered and summarized
after all text file differences are reported.
-p
With unified and context diffs, show with each change
the first 40 characters of the last line before the context beginning
with a letter, an underscore or a dollar sign.
For C source code following standard layout conventions, this will
show the prototype of the function the change applies to.
-T
Print a tab rather than a space before the rest of the line for the
normal, context or unified output formats.
This makes the alignment of tabs in the line consistent.
-t
Will expand tabs in output lines.
Normal or
-c
output adds character(s) to the front of each line which may screw up
the indentation of the original source lines and make the output listing
difficult to interpret.
This option will preserve the original source's indentation.
-w
Is similar to
-b
but causes whitespace (blanks and tabs) to be totally ignored.
E.g.,
if (\ \&a == b \&)
will compare equal to
if(a==b).
Directory comparison options:
-N
If a file is found in only one directory, act as if it was found in the
other directory too but was of zero size.
-P
If a file is found only in
dir2,
act as if it was found in
dir1
too but was of zero size.
-r
Causes application of
diff
recursively to common subdirectories encountered.
-S name
Re-starts a directory
diff
in the middle, beginning with file
name.
-s
Causes
diff
to report files which are the same, which are otherwise not mentioned.
-X file
Exclude files and subdirectories from comparison whose basenames match
lines in
file.
Multiple
-X
options may be specified.
-x pattern
Exclude files and subdirectories from comparison whose basenames match
pattern.
Patterns are matched using shell-style globbing via
fnmatch(3).
Multiple
-x
options may be specified.
If both arguments are directories,
diff
sorts the contents of the directories by name, and then runs the
regular file
diff
algorithm, producing a change list,
on text files which are different.
Binary files which differ,
common subdirectories, and files which appear in only one directory
are described as such.
In directory mode only regular files and directories are compared.
If a non-regular file such as a device special file or
FIFO
is encountered, a diagnostic message is printed.
If only one of
file1
and
file2
is a directory,
diff
is applied to the non-directory file and the file contained in
the directory file with a filename that is the same as the
last component of the non-directory file.
If either
file1
or
file2
is
-,
the standard input is
used in its place.
Output Style
The default (without
-e,
-c,
or
-n
options)
output contains lines of these forms, where
XX, YY , ZZ , QQ
are line numbers respective of file order.
XX
At (the end of) line
XX
of
file1,
append the contents
of line
YY
of
file2
to make them equal.
XX
Same as above, but append the range of lines,
YY
through
ZZ
of
file2
to line
XX
of file1.
XX
At line
XX
delete
the line.
The value
YY
tells to which line the change would bring
file1
in line with
file1.
XX,YY
Delete the range of lines
XX
through
YY
in
file1.
XX
Change the line
XX
in
file1
to the line
YY
in
file2.
XX,YY
Replace the range of specified lines with the line
ZZ.
XX,YY
Replace the range
XX,
from
file1
with the range
ZZ,
from
file2.
These lines resemble
ed(1)
subcommands to convert
file1
into
file2.
The line numbers before the action letters pertain to
file1;
those after pertain to
file2.
Thus, by exchanging
a
for
d
and reading the line in reverse order, one can also
determine how to convert
file2
into
file1.
As in
ed(1),
identical
pairs (where num1 = num2) are abbreviated as a single
number.
ENVIRONMENT
TMPDIR
If the environment variable
TMPDIR
exists,
diff
will use the directory specified by
TMPDIR
as the temporary directory.
FILES
/tmp/diff.
Temporary file used when comparing a device or the standard input.
Note that the temporary file is unlinked as soon as it is created
so it will not show up in a directory listing.
DIAGNOSTICS
The
diff
utility exits with one of the following values:
The
diff
utility is compliant with the
specification.
The flags
[-aDdIiLlNnPpqSsTtwXx]
are extensions to that specification.
HISTORY
A
diff
command appeared in
Version 6 AT&T UNIX.
BUGS
When comparing directories with the
-b,
-w
or
-i
options specified,
diff
first compares the files ala
cmp(1),
and then decides to run the
diff
algorithm if they are not equal.
This may cause a small amount of spurious output if the files
then turn out to be identical because the only differences are
insignificant whitespace or case differences.