GNU diff — compare files line by line

Examples (TL;DR)


diff [OPTION]... FILES


Compare FILES line by line.

Mandatory arguments to long options are mandatory for short options too.


output a normal diff (the default)

-q, --brief

report only when files differ

-s, --report-identical-files

report when two files are the same

-c, -C NUM, --context[=NUM]

output NUM (default 3) lines of copied context

-u, -U NUM, --unified[=NUM]

output NUM (default 3) lines of unified context

-e, --ed

output an ed script

-n, --rcs

output an RCS format diff

-y, --side-by-side

output in two columns

-W, --width=NUM

output at most NUM (default 130) print columns


output only the left column of 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


tab stops every NUM (default 8) print columns


suppress space or tab before empty output lines

-l, --paginate

pass output through 'pr' to paginate it

-r, --recursive

recursively compare any subdirectories found


don't follow symbolic links

-N, --new-file

treat absent files as empty


treat absent first files as empty


ignore case when comparing file names


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


compare FILE1 to all operands; FILE1 can be a directory


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

-Z, --ignore-trailing-space

ignore white space at line end

-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 carriage return on input

-D, --ifdef=NAME

output merged file with '#ifdef NAME' diffs


format GTYPE input groups with GFMT


format all input lines with LFMT


format LTYPE input lines with 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


printf-style spec for LETTER

LETTERs are as follows for new group, lower case for old group:


first line number


last line number


number of lines = L-F+1






if A equals B then T else E

LFMT (only) may contain:


contents of line


contents of line, excluding any trailing newline


printf-style spec for input line number

Both GFMT and LFMT may contain:




the single character C


the character with octal code OOO


the character C (other characters represent themselves)

-d, --minimal

try hard to find a smaller set of changes


keep NUM lines of the common prefix and suffix


assume large files and many scattered small changes


colorize the output; WHEN can be 'never', 'always', or 'auto' (the default)


the colors to use when --color is active; PALETTE is a colon-separated list of terminfo capabilities


display this help and exit

-v, --version

output version information and exit

FILES are 'FILE1 FILE2' or 'DIR1 DIR2' or 'DIR FILE' or 'FILE DIR'. If --from-file or --to-file is given, there are no restrictions on FILE(s). If a FILE is '-', read standard input. Exit status is 0 if inputs are the same, 1 if different, 2 if trouble.


Written by Paul Eggert, Mike Haertel, David Hayes, Richard Stallman, and Len Tower.

Reporting Bugs

Report bugs to:
GNU diffutils home page: <>
General help using GNU software: <>

See Also

wdiff(1), cmp(1), diff3(1), sdiff(1), patch(1)

The full documentation for GNU is maintained as a Texinfo manual.  If the info and GNU programs are properly installed at your site, the command

info GNU

should give you access to the complete manual.

Referenced By

atool(1), bzdiff(1), cmp(1), combinediff(1), darcs(1), dbfilediff(1), debrepro(1), diff3(1), diffoscope(1), diffpp(1), diffstat(1), dwdiff(1), dwfilter(1), fixcvsdiff(1), flipdiff(1), gdiffmk(1), gendiff(1), git-diff(1), git-diff-files(1), git-diff-index(1), git-diff-tree(1), grep(1), hg(1), interdiff(1), ixplore(1), lbzdiff(1), mandoc.db(5), manlifter(1), merge(1), ntfscmp(8), oggz-diff(1), patch(1), patool(1), perlbug(1), perlhist(1), pycocci(1), rancid_intro(1), rc(1), rcsdiff(1), rpmdev-diff(1), sdiff(1), sgmldiff(1), spatch(1), spgen(1), srec_cat(1), suffixes(7), t-prot(1), unifdef(1), wiggle(1), xs(1), xzdiff(1), zdiff(1).

July 2019 diffutils 3.7