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