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