xref: /freebsd-14.2/usr.bin/diff/diff.1 (revision fddcb7b8)
1.\" $OpenBSD: diff.1,v 1.47 2015/11/24 19:35:41 jmc Exp $
2.\"
3.\" Copyright (c) 1980, 1990, 1993
4.\"	The Regents of the University of California.  All rights reserved.
5.\"
6.\" Redistribution and use in source and binary forms, with or without
7.\" modification, are permitted provided that the following conditions
8.\" are met:
9.\" 1. Redistributions of source code must retain the above copyright
10.\"    notice, this list of conditions and the following disclaimer.
11.\" 2. Redistributions in binary form must reproduce the above copyright
12.\"    notice, this list of conditions and the following disclaimer in the
13.\"    documentation and/or other materials provided with the distribution.
14.\" 3. Neither the name of the University nor the names of its contributors
15.\"    may be used to endorse or promote products derived from this software
16.\"    without specific prior written permission.
17.\"
18.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
19.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
22.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28.\" SUCH DAMAGE.
29.\"
30.\"     @(#)diff.1	8.1 (Berkeley) 6/30/93
31.\" $FreeBSD$
32.\"
33.Dd April 20, 2017
34.Dt DIFF 1
35.Os
36.Sh NAME
37.Nm diff
38.Nd differential file and directory comparator
39.Sh SYNOPSIS
40.Nm diff
41.Op Fl abdipTtw
42.Oo
43.Fl c | e | f |
44.Fl n | q | u
45.Oc
46.Op Fl -brief
47.Op Fl -changed-group-format Ar GFMT
48.Op Fl -ed
49.Op Fl -expand-tabs
50.Op Fl -forward-ed
51.Op Fl -ignore-all-space
52.Op Fl -ignore-case
53.Op Fl -ignore-space-change
54.Op Fl -initial-tab
55.Op Fl -minimal
56.Op Fl -no-ignore-file-name-case
57.Op Fl -normal
58.Op Fl -rcs
59.Op Fl -show-c-function
60.Op Fl -starting-file
61.Op Fl -speed-large-files
62.Op Fl -strip-trailing-cr
63.Op Fl -tabsize
64.Op Fl -text
65.Op Fl -unified
66.Op Fl I Ar pattern | Fl -ignore-matching-lines Ar pattern
67.Op Fl L Ar label | Fl -label Ar label
68.Ar file1 file2
69.Nm diff
70.Op Fl abdilpTtw
71.Op Fl I Ar pattern | Fl -ignore-matching-lines Ar pattern
72.Op Fl L Ar label | Fl -label Ar label
73.Op Fl -brief
74.Op Fl -changed-group-format Ar GFMT
75.Op Fl -ed
76.Op Fl -expand-tabs
77.Op Fl -forward-ed
78.Op Fl -ignore-all-space
79.Op Fl -ignore-case
80.Op Fl -ignore-space-change
81.Op Fl -initial-tab
82.Op Fl -minimal
83.Op Fl -no-ignore-file-name-case
84.Op Fl -normal
85.Op Fl -paginate
86.Op Fl -rcs
87.Op Fl -show-c-function
88.Op Fl -speed-large-files
89.Op Fl -starting-file
90.Op Fl -strip-trailing-cr
91.Op Fl -tabsize
92.Op Fl -text
93.Fl C Ar number | -context Ar number
94.Ar file1 file2
95.Nm diff
96.Op Fl abdiltw
97.Op Fl I Ar pattern | Fl -ignore-matching-lines Ar pattern
98.Op Fl -brief
99.Op Fl -changed-group-format Ar GFMT
100.Op Fl -ed
101.Op Fl -expand-tabs
102.Op Fl -forward-ed
103.Op Fl -ignore-all-space
104.Op Fl -ignore-case
105.Op Fl -ignore-space-change
106.Op Fl -initial-tab
107.Op Fl -minimal
108.Op Fl -no-ignore-file-name-case
109.Op Fl -normal
110.Op Fl -paginate
111.Op Fl -rcs
112.Op Fl -show-c-function
113.Op Fl -speed-large-files
114.Op Fl -starting-file
115.Op Fl -strip-trailing-cr
116.Op Fl -tabsize
117.Op Fl -text
118.Fl D Ar string | Fl -ifdef Ar string
119.Ar file1 file2
120.Nm diff
121.Op Fl abdilpTtw
122.Op Fl I Ar pattern | Fl -ignore-matching-lines Ar pattern
123.Op Fl L Ar label | Fl -label Ar label
124.Op Fl -brief
125.Op Fl -changed-group-format Ar GFMT
126.Op Fl -ed
127.Op Fl -expand-tabs
128.Op Fl -forward-ed
129.Op Fl -ignore-all-space
130.Op Fl -ignore-case
131.Op Fl -ignore-space-change
132.Op Fl -initial-tab
133.Op Fl -minimal
134.Op Fl -no-ignore-file-name-case
135.Op Fl -normal
136.Op Fl -paginate
137.Op Fl -rcs
138.Op Fl -show-c-function
139.Op Fl -speed-large-files
140.Op Fl -starting-file
141.Op Fl -strip-trailing-cr
142.Op Fl -tabsize
143.Op Fl -text
144.Fl U Ar number | Fl -unified Ar number
145.Ar file1 file2
146.Nm diff
147.Op Fl abdilNPprsTtw
148.Oo
149.Fl c | e | f |
150.Fl n | q | u
151.Oc
152.Op Fl -brief
153.Op Fl -changed-group-format Ar GFMT
154.Op Fl -context
155.Op Fl -ed
156.Op Fl -expand-tabs
157.Op Fl -forward-ed
158.Op Fl -ignore-all-space
159.Op Fl -ignore-case
160.Op Fl -ignore-space-change
161.Op Fl -initial-tab
162.Op Fl -minimal
163.Op Fl -new-file
164.Op Fl -no-ignore-file-name-case
165.Op Fl -normal
166.Op Fl -paginate
167.Op Fl -rcs
168.Op Fl -recursive
169.Op Fl -report-identical-files
170.Op Fl -show-c-function
171.Op Fl -speed-large-files
172.Op Fl -strip-trailing-cr
173.Op Fl -tabsize
174.Op Fl -text
175.Op Fl -unidirectional-new-file
176.Op Fl -unified
177.Op Fl I Ar pattern | Fl -ignore-matching-lines Ar pattern
178.Bk -words
179.Op Fl L Ar label | Fl -label Ar label
180.Op Fl S Ar name | Fl -starting-file Ar name
181.Op Fl X Ar file | Fl -exclude-from Ar file
182.Op Fl x Ar pattern | Fl -exclude Ar pattern
183.Ek
184.Ar dir1 dir2
185.Sh DESCRIPTION
186The
187.Nm
188utility compares the contents of
189.Ar file1
190and
191.Ar file2
192and writes to the standard output the list of changes necessary to
193convert one file into the other.
194No output is produced if the files are identical.
195.Pp
196Output options (mutually exclusive):
197.Bl -tag -width Ds
198.It Fl C Ar number
199Like
200.Fl c
201but produces a diff with
202.Ar number
203lines of context.
204.It Fl c
205Produces a diff with 3 lines of context.
206With
207.Fl c
208the output format is modified slightly:
209the output begins with identification of the files involved and
210their creation dates and then each change is separated
211by a line with fifteen
212.Li * Ns 's .
213The lines removed from
214.Ar file1
215are marked with
216.Sq \&-\ \& ;
217those added to
218.Ar file2
219are marked
220.Sq \+\ \& .
221Lines which are changed from one file to the other are marked in
222both files with
223.Sq !\ \& .
224Changes which lie within 3 lines of each other are grouped together on
225output.
226.It Fl D Ar string
227Creates a merged version of
228.Ar file1
229and
230.Ar file2
231on the standard output, with C preprocessor controls included so that
232a compilation of the result without defining
233.Ar string
234is equivalent to compiling
235.Ar file1 ,
236while defining
237.Ar string
238will yield
239.Ar file2 .
240.It Fl e
241Produces output in a form suitable as input for the editor utility,
242.Xr ed 1 ,
243which can then be used to convert file1 into file2.
244.Pp
245Extra commands are added to the output when comparing directories with
246.Fl e ,
247so that the result is a
248.Xr sh 1
249script for converting text files which are common to the two directories
250from their state in
251.Ar dir1
252to their state in
253.Ar dir2 .
254.It Fl f
255Identical output to that of the
256.Fl e
257flag, but in reverse order.
258It cannot be digested by
259.Xr ed 1 .
260.It Fl n
261Produces a script similar to that of
262.Fl e ,
263but in the opposite order and with a count of changed lines on each
264insert or delete command.
265This is the form used by
266.Xr rcsdiff 1 .
267.It Fl q
268Just print a line when the files differ.
269Does not output a list of changes.
270.It Fl U Ar number
271Like
272.Fl u
273but produces a diff with
274.Ar number
275lines of context.
276.It Fl u
277Produces a
278.Em unified
279diff with 3 lines of context.
280A unified diff is similar to the context diff produced by the
281.Fl c
282option.
283However, unlike with
284.Fl c ,
285all lines to be changed (added and/or removed) are present in
286a single section.
287.El
288.Pp
289Comparison options:
290.Bl -tag -width Ds
291.It Fl a
292Treat all files as
293.Tn ASCII
294text.
295Normally
296.Nm
297will simply print
298.Dq Binary files ... differ
299if files contain binary characters.
300Use of this option forces
301.Nm
302to produce a diff.
303.It Fl b
304Causes trailing blanks (spaces and tabs) to be ignored, and other
305strings of blanks to compare equal.
306.It Fl d
307Try very hard to produce a diff as small as possible.
308This may consume a lot of processing power and memory when processing
309large files with many changes.
310.It Fl I Ar pattern
311Ignores changes, insertions, and deletions whose lines match the
312extended regular expression
313.Ar pattern .
314Multiple
315.Fl I
316patterns may be specified.
317All lines in the change must match some pattern for the change to be
318ignored.
319See
320.Xr re_format 7
321for more information on regular expression patterns.
322.It Fl i
323Ignores the case of letters.
324E.g.,
325.Dq A
326will compare equal to
327.Dq a .
328.It Fl l
329Pass the output through
330.Xr pr 1
331to paginate it.
332.It Fl L Ar label
333Print
334.Ar label
335instead of the first (and second, if this option is specified twice)
336file name and time in the context or unified diff header.
337.It Fl p
338With unified and context diffs, show with each change
339the first 40 characters of the last line before the context beginning
340with a letter, an underscore or a dollar sign.
341For C source code following standard layout conventions, this will
342show the prototype of the function the change applies to.
343.It Fl T
344Print a tab rather than a space before the rest of the line for the
345normal, context or unified output formats.
346This makes the alignment of tabs in the line consistent.
347.It Fl t
348Will expand tabs in output lines.
349Normal or
350.Fl c
351output adds character(s) to the front of each line which may screw up
352the indentation of the original source lines and make the output listing
353difficult to interpret.
354This option will preserve the original source's indentation.
355.It Fl w
356Is similar to
357.Fl b
358but causes whitespace (blanks and tabs) to be totally ignored.
359E.g.,
360.Dq if (\ \&a == b \&)
361will compare equal to
362.Dq if(a==b) .
363.It Fl -changed-group-format Ar GFMT
364Format input groups in the provided
365.Pp
366the format is a string with special keywords:
367.Bl -tag -width %<
368.It %<
369lines from FILE1
370.It %<
371lines from FILE2
372.El
373.El
374.Pp
375Directory comparison options:
376.Bl -tag -width Ds
377.It Fl N
378If a file is found in only one directory, act as if it was found in the
379other directory too but was of zero size.
380.It Fl P
381If a file is found only in
382.Ar dir2 ,
383act as if it was found in
384.Ar dir1
385too but was of zero size.
386.It Fl r
387Causes application of
388.Nm
389recursively to common subdirectories encountered.
390.It Fl S Ar name
391Re-starts a directory
392.Nm
393in the middle, beginning with file
394.Ar name .
395.It Fl s
396Causes
397.Nm
398to report files which are the same, which are otherwise not mentioned.
399.It Fl X Ar file
400Exclude files and subdirectories from comparison whose basenames match
401lines in
402.Ar file .
403Multiple
404.Fl X
405options may be specified.
406.It Fl x Ar pattern
407Exclude files and subdirectories from comparison whose basenames match
408.Ar pattern .
409Patterns are matched using shell-style globbing via
410.Xr fnmatch 3 .
411Multiple
412.Fl x
413options may be specified.
414.El
415.Pp
416If both arguments are directories,
417.Nm
418sorts the contents of the directories by name, and then runs the
419regular file
420.Nm
421algorithm, producing a change list,
422on text files which are different.
423Binary files which differ,
424common subdirectories, and files which appear in only one directory
425are described as such.
426In directory mode only regular files and directories are compared.
427If a non-regular file such as a device special file or
428.Tn FIFO
429is encountered, a diagnostic message is printed.
430.Pp
431If only one of
432.Ar file1
433and
434.Ar file2
435is a directory,
436.Nm
437is applied to the non-directory file and the file contained in
438the directory file with a filename that is the same as the
439last component of the non-directory file.
440.Pp
441If either
442.Ar file1
443or
444.Ar file2
445is
446.Sq - ,
447the standard input is
448used in its place.
449.Ss Output Style
450The default (without
451.Fl e ,
452.Fl c ,
453or
454.Fl n
455.\" -C
456options)
457output contains lines of these forms, where
458.Va XX , YY , ZZ , QQ
459are line numbers respective of file order.
460.Pp
461.Bl -tag -width "XX,YYcZZ,QQ" -compact
462.It Li XX Ns Ic a Ns Li YY
463At (the end of) line
464.Va XX
465of
466.Ar file1 ,
467append the contents
468of line
469.Va YY
470of
471.Ar file2
472to make them equal.
473.It Li XX Ns Ic a Ns Li YY,ZZ
474Same as above, but append the range of lines,
475.Va YY
476through
477.Va ZZ
478of
479.Ar file2
480to line
481.Va XX
482of file1.
483.It Li XX Ns Ic d Ns Li YY
484At line
485.Va XX
486delete
487the line.
488The value
489.Va YY
490tells to which line the change would bring
491.Ar file1
492in line with
493.Ar file2 .
494.It Li XX,YY Ns Ic d Ns Li ZZ
495Delete the range of lines
496.Va XX
497through
498.Va YY
499in
500.Ar file1 .
501.It Li XX Ns Ic c Ns Li YY
502Change the line
503.Va XX
504in
505.Ar file1
506to the line
507.Va YY
508in
509.Ar file2 .
510.It Li XX,YY Ns Ic c Ns Li ZZ
511Replace the range of specified lines with the line
512.Va ZZ .
513.It Li XX,YY Ns Ic c Ns Li ZZ,QQ
514Replace the range
515.Va XX , Ns Va YY
516from
517.Ar file1
518with the range
519.Va ZZ , Ns Va QQ
520from
521.Ar file2 .
522.El
523.Pp
524These lines resemble
525.Xr ed 1
526subcommands to convert
527.Ar file1
528into
529.Ar file2 .
530The line numbers before the action letters pertain to
531.Ar file1 ;
532those after pertain to
533.Ar file2 .
534Thus, by exchanging
535.Ic a
536for
537.Ic d
538and reading the line in reverse order, one can also
539determine how to convert
540.Ar file2
541into
542.Ar file1 .
543As in
544.Xr ed 1 ,
545identical
546pairs (where num1 = num2) are abbreviated as a single
547number.
548.Sh FILES
549.Bl -tag -width /tmp/diff.XXXXXXXX -compact
550.It Pa /tmp/diff. Ns Ar XXXXXXXX
551Temporary file used when comparing a device or the standard input.
552Note that the temporary file is unlinked as soon as it is created
553so it will not show up in a directory listing.
554.El
555.Sh EXIT STATUS
556The
557.Nm
558utility exits with one of the following values:
559.Pp
560.Bl -tag -width Ds -offset indent -compact
561.It 0
562No differences were found.
563.It 1
564Differences were found.
565.It >1
566An error occurred.
567.El
568.Sh SEE ALSO
569.Xr cmp 1 ,
570.Xr comm 1 ,
571.Xr diff3 1 ,
572.Xr ed 1 ,
573.Xr patch 1 ,
574.Xr sdiff 1
575.Rs
576.%A James W. Hunt
577.%A M. Douglas McIlroy
578.%T "An Algorithm for Differential File Comparison"
579.%J Computing Science Technical Report
580.%Q Bell Laboratories 41
581.%D June 1976
582.Re
583.Sh STANDARDS
584The
585.Nm
586utility is compliant with the
587.St -p1003.1-2008
588specification.
589.Pp
590The flags
591.Op Fl aDdIiLlNnPpqSsTtwXx
592are extensions to that specification.
593.Sh HISTORY
594A
595.Nm
596command appeared in
597.At v6 .
598