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 June 19, 2020 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 aBbdipTtw 42.Oo 43.Fl c | e | f | 44.Fl n | q | u | y 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 Ar number 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 aBbdilpTtw 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 Ar number 92.Op Fl -text 93.Fl C Ar number | -context Ar number 94.Ar file1 file2 95.Nm diff 96.Op Fl aBbdiltw 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 Ar number 117.Op Fl -text 118.Fl D Ar string | Fl -ifdef Ar string 119.Ar file1 file2 120.Nm diff 121.Op Fl aBbdilpTtw 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 Ar number 143.Op Fl -text 144.Fl U Ar number | Fl -unified Ar number 145.Ar file1 file2 146.Nm diff 147.Op Fl aBbdilNPprsTtw 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 Ar number 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.Nm diff 186.Op Fl aBbditwW 187.Op Fl -expand-tabs 188.Op Fl -ignore-all-blanks 189.Op Fl -ignore-blank-lines 190.Op Fl -ignore-case 191.Op Fl -minimal 192.Op Fl -no-ignore-file-name-case 193.Op Fl -strip-trailing-cr 194.Op Fl -suppress-common-lines 195.Op Fl -tabsize Ar number 196.Op Fl -text 197.Op Fl -width 198.Fl y | Fl -side-by-side 199.Ar file1 file2 200.Sh DESCRIPTION 201The 202.Nm 203utility compares the contents of 204.Ar file1 205and 206.Ar file2 207and writes to the standard output the list of changes necessary to 208convert one file into the other. 209No output is produced if the files are identical. 210.Pp 211Output options (mutually exclusive): 212.Bl -tag -width Ds 213.It Fl C Ar number Fl -context Ar number 214Like 215.Fl c 216but produces a diff with 217.Ar number 218lines of context. 219.It Fl c 220Produces a diff with 3 lines of context. 221With 222.Fl c 223the output format is modified slightly: 224the output begins with identification of the files involved and 225their creation dates and then each change is separated 226by a line with fifteen 227.Li * Ns 's . 228The lines removed from 229.Ar file1 230are marked with 231.Sq \&-\ \& ; 232those added to 233.Ar file2 234are marked 235.Sq +\ \& . 236Lines which are changed from one file to the other are marked in 237both files with 238.Sq !\ \& . 239Changes which lie within 3 lines of each other are grouped together on 240output. 241.It Fl D Ar string Fl -ifdef Ar string 242Creates a merged version of 243.Ar file1 244and 245.Ar file2 246on the standard output, with C preprocessor controls included so that 247a compilation of the result without defining 248.Ar string 249is equivalent to compiling 250.Ar file1 , 251while defining 252.Ar string 253will yield 254.Ar file2 . 255.It Fl e -ed 256Produces output in a form suitable as input for the editor utility, 257.Xr ed 1 , 258which can then be used to convert file1 into file2. 259.Pp 260Extra commands are added to the output when comparing directories with 261.Fl e , 262so that the result is a 263.Xr sh 1 264script for converting text files which are common to the two directories 265from their state in 266.Ar dir1 267to their state in 268.Ar dir2 . 269.It Fl f -forward-ed 270Identical output to that of the 271.Fl e 272flag, but in reverse order. 273It cannot be digested by 274.Xr ed 1 . 275.It Fl n 276Produces a script similar to that of 277.Fl e , 278but in the opposite order and with a count of changed lines on each 279insert or delete command. 280This is the form used by rcsdiff. 281.It Fl q -brief 282Just print a line when the files differ. 283Does not output a list of changes. 284.It Fl U Ar number Fl -unified Ar number 285Like 286.Fl u 287but produces a diff with 288.Ar number 289lines of context. 290.It Fl u 291Produces a 292.Em unified 293diff with 3 lines of context. 294A unified diff is similar to the context diff produced by the 295.Fl c 296option. 297However, unlike with 298.Fl c , 299all lines to be changed (added and/or removed) are present in 300a single section. 301.It Fl y Fl -side-by-side 302Output in two columns with a marker between them. 303The marker can be one 304of the following: 305.Pp 306.Bl -tag -width Ds -offset indent -compact 307.It space 308Corresponding lines are identical. 309.It '|' 310Corresponding lines are different. 311.It '<' 312Files differ and only the first file contains the line. 313.It '>' 314Files differ and only the second file contains the line. 315.El 316.El 317.Pp 318Comparison options: 319.Bl -tag -width Ds 320.It Fl a -text 321Treat all files as ASCII text. 322Normally 323.Nm 324will simply print 325.Dq Binary files ... differ 326if files contain binary characters. 327Use of this option forces 328.Nm 329to produce a diff. 330.It Fl B Fl -ignore-blank-lines 331Causes chunks that include only blank lines to be ignored. 332.It Fl b -ignore-space-change 333Causes trailing blanks (spaces and tabs) to be ignored, and other 334strings of blanks to compare equal. 335.It Fl d -minimal 336Try very hard to produce a diff as small as possible. 337This may consume a lot of processing power and memory when processing 338large files with many changes. 339.It Fl I Ar pattern Fl -ignore-matching-lines Ar pattern 340Ignores changes, insertions, and deletions whose lines match the 341extended regular expression 342.Ar pattern . 343Multiple 344.Fl I 345patterns may be specified. 346All lines in the change must match some pattern for the change to be 347ignored. 348See 349.Xr re_format 7 350for more information on regular expression patterns. 351.It Fl i -ignore-case 352Ignores the case of letters. 353E.g., 354.Dq A 355will compare equal to 356.Dq a . 357.It Fl l -paginate 358Pass the output through 359.Xr pr 1 360to paginate it. 361.It Fl L Ar label Fl -label Ar label 362Print 363.Ar label 364instead of the first (and second, if this option is specified twice) 365file name and time in the context or unified diff header. 366.It Fl p -show-c-function 367With unified and context diffs, show with each change 368the first 40 characters of the last line before the context beginning 369with a letter, an underscore or a dollar sign. 370For C source code following standard layout conventions, this will 371show the prototype of the function the change applies to. 372.It Fl T -initial-tab 373Print a tab rather than a space before the rest of the line for the 374normal, context or unified output formats. 375This makes the alignment of tabs in the line consistent. 376.It Fl t -expand-tabs 377Will expand tabs in output lines. 378Normal or 379.Fl c 380output adds character(s) to the front of each line which may screw up 381the indentation of the original source lines and make the output listing 382difficult to interpret. 383This option will preserve the original source's indentation. 384.It Fl w -ignore-all-blanks 385Is similar to 386.Fl b -ignore-space-change 387but causes whitespace (blanks and tabs) to be totally ignored. 388E.g., 389.Dq if (\ \&a == b \&) 390will compare equal to 391.Dq if(a==b) . 392.It Fl W Ar number Fl -width Ar number 393Output at most 394.Ar number 395columns when using side by side format. 396The default value is 130. 397.It Fl -changed-group-format Ar GFMT 398Format input groups in the provided 399.Pp 400the format is a string with special keywords: 401.Bl -tag -width %< 402.It %< 403lines from FILE1 404.It %< 405lines from FILE2 406.El 407.It Fl -ignore-file-name-case 408ignore case when comparing file names 409.It Fl -no-ignore-file-name-case 410do not ignore case wen comparing file names (default) 411.It Fl -normal 412default diff output 413.It Fl -speed-large-files 414stub option for compatibility with GNU diff 415.It Fl -strip-trailing-cr 416strip carriage return on input files 417.It Fl -suppress-common-lines 418Do not output common lines when using the side by side format 419.It Fl -tabsize Ar number 420Number of spaces representing a tab (default 8) 421.El 422.Pp 423Directory comparison options: 424.Bl -tag -width Ds 425.It Fl N -new-file 426If a file is found in only one directory, act as if it was found in the 427other directory too but was of zero size. 428.It Fl P -unidirectional-new-file 429If a file is found only in 430.Ar dir2 , 431act as if it was found in 432.Ar dir1 433too but was of zero size. 434.It Fl r -recursive 435Causes application of 436.Nm 437recursively to common subdirectories encountered. 438.It Fl S Ar name Fl -starting-file Ar name 439Re-starts a directory 440.Nm 441in the middle, beginning with file 442.Ar name . 443.It Fl s -report-identical-files 444Causes 445.Nm 446to report files which are the same, which are otherwise not mentioned. 447.It Fl X Ar file Fl -exclude-from Ar file 448Exclude files and subdirectories from comparison whose basenames match 449lines in 450.Ar file . 451Multiple 452.Fl X 453options may be specified. 454.It Fl x Ar pattern Fl -exclude Ar pattern 455Exclude files and subdirectories from comparison whose basenames match 456.Ar pattern . 457Patterns are matched using shell-style globbing via 458.Xr fnmatch 3 . 459Multiple 460.Fl x 461options may be specified. 462.El 463.Pp 464If both arguments are directories, 465.Nm 466sorts the contents of the directories by name, and then runs the 467regular file 468.Nm 469algorithm, producing a change list, 470on text files which are different. 471Binary files which differ, 472common subdirectories, and files which appear in only one directory 473are described as such. 474In directory mode only regular files and directories are compared. 475If a non-regular file such as a device special file or FIFO is encountered, 476a diagnostic message is printed. 477.Pp 478If only one of 479.Ar file1 480and 481.Ar file2 482is a directory, 483.Nm 484is applied to the non-directory file and the file contained in 485the directory file with a filename that is the same as the 486last component of the non-directory file. 487.Pp 488If either 489.Ar file1 490or 491.Ar file2 492is 493.Sq - , 494the standard input is 495used in its place. 496.Ss Output Style 497The default (without 498.Fl e , 499.Fl c , 500or 501.Fl n -rcs 502.\" -C 503options) 504output contains lines of these forms, where 505.Va XX , YY , ZZ , QQ 506are line numbers respective of file order. 507.Pp 508.Bl -tag -width "XX,YYcZZ,QQ" -compact 509.It Li XX Ns Ic a Ns Li YY 510At (the end of) line 511.Va XX 512of 513.Ar file1 , 514append the contents 515of line 516.Va YY 517of 518.Ar file2 519to make them equal. 520.It Li XX Ns Ic a Ns Li YY,ZZ 521Same as above, but append the range of lines, 522.Va YY 523through 524.Va ZZ 525of 526.Ar file2 527to line 528.Va XX 529of file1. 530.It Li XX Ns Ic d Ns Li YY 531At line 532.Va XX 533delete 534the line. 535The value 536.Va YY 537tells to which line the change would bring 538.Ar file1 539in line with 540.Ar file2 . 541.It Li XX,YY Ns Ic d Ns Li ZZ 542Delete the range of lines 543.Va XX 544through 545.Va YY 546in 547.Ar file1 . 548.It Li XX Ns Ic c Ns Li YY 549Change the line 550.Va XX 551in 552.Ar file1 553to the line 554.Va YY 555in 556.Ar file2 . 557.It Li XX,YY Ns Ic c Ns Li ZZ 558Replace the range of specified lines with the line 559.Va ZZ . 560.It Li XX,YY Ns Ic c Ns Li ZZ,QQ 561Replace the range 562.Va XX , Ns Va YY 563from 564.Ar file1 565with the range 566.Va ZZ , Ns Va QQ 567from 568.Ar file2 . 569.El 570.Pp 571These lines resemble 572.Xr ed 1 573subcommands to convert 574.Ar file1 575into 576.Ar file2 . 577The line numbers before the action letters pertain to 578.Ar file1 ; 579those after pertain to 580.Ar file2 . 581Thus, by exchanging 582.Ic a 583for 584.Ic d 585and reading the line in reverse order, one can also 586determine how to convert 587.Ar file2 588into 589.Ar file1 . 590As in 591.Xr ed 1 , 592identical 593pairs (where num1 = num2) are abbreviated as a single 594number. 595.Sh FILES 596.Bl -tag -width /tmp/diff.XXXXXXXX -compact 597.It Pa /tmp/diff.XXXXXXXX 598Temporary file used when comparing a device or the standard input. 599Note that the temporary file is unlinked as soon as it is created 600so it will not show up in a directory listing. 601.El 602.Sh EXIT STATUS 603The 604.Nm 605utility exits with one of the following values: 606.Pp 607.Bl -tag -width Ds -offset indent -compact 608.It 0 609No differences were found. 610.It 1 611Differences were found. 612.It >1 613An error occurred. 614.El 615.Sh EXAMPLES 616Compare 617.Pa old_dir 618and 619.Pa new_dir 620recursively generating an unified diff and treating files found only in one 621of those directories as new files: 622.Bd -literal -offset indent 623$ diff -ruN /path/to/old_dir /path/to/new_dir 624.Ed 625.Pp 626Same as above but excluding files matching the expressions 627.Dq *.h 628and 629.Dq *.c : 630.Bd -literal -offset indent 631$ diff -ruN -x '*.h' -x '*.c' /path/to/old_dir /path/to/new_dir 632.Ed 633.Pp 634Show a single line indicating if the files differ: 635.Bd -literal -offset indent 636$ diff -q /boot/loader.conf /boot/defaults/loader.conf 637Files /boot/loader.conf and /boot/defaults/loader.conf differ 638.Ed 639.Pp 640Assuming a file named 641.Pa example.txt 642with the following contents: 643.Bd -literal -offset indent 644FreeBSD is an operating system 645Linux is a kernel 646OpenBSD is an operating system 647.Ed 648.Pp 649Compare stdin with 650.Pa example.txt 651excluding from the comparison those lines containing either 652.Qq Linux 653or 654.Qq Open : 655.Bd -literal -offset indent 656$ echo "FreeBSD is an operating system" | diff -q -I 'Linux|Open' example.txt - 657.Ed 658.Sh SEE ALSO 659.Xr cmp 1 , 660.Xr comm 1 , 661.Xr diff3 1 , 662.Xr ed 1 , 663.Xr patch 1 , 664.Xr pr 1 , 665.Xr sdiff 1 666.Rs 667.%A James W. Hunt 668.%A M. Douglas McIlroy 669.%T "An Algorithm for Differential File Comparison" 670.%J Computing Science Technical Report 671.%Q Bell Laboratories 41 672.%D June 1976 673.Re 674.Sh STANDARDS 675The 676.Nm 677utility is compliant with the 678.St -p1003.1-2008 679specification. 680.Pp 681The flags 682.Op Fl aDdIiLlNnPpqSsTtwXxy 683are extensions to that specification. 684.Sh HISTORY 685A 686.Nm 687command appeared in 688.At v6 . 689