Linux diff and patch

Crete a patch

The Linux diff program can be used to record differences between two directories, making it easy to update the old directory later with any of the changes created in the new version of the directory.

cd /var/tmp cp -a old_wrk new_wrk cd new_wrk # create new files and modify existing ones # …
# now record all the changes we introduced cd ${HOME} diff -ruN /var/tmp/old_wrk /var/tmp/new_wrk > update.patch

Standard (usual) options:

-r –recursiveRecursively compare any subdirectories found
-u –unified[=NUM]Output NUM (default 3) lines of unified context
-N –new-fileTreat absent files as empty

Additional useful option(s):

-a –textTreat all files as text

Use the patch to apply updates

We can now use update.patch to update the old directory so its contents match all the changes introduced in new_wrk.

cd /var/tmp patch -b -uN -d old_wrk -p 4 < ${HOME}/update.patch

Standard (usual) options:

-b –backupBack up the original contents of each file
-u –unifiedInterpret the patch as a unified difference
-N –forwardIgnore patches that appear to be reversed or already applied
-p NUM –strip=NUMStrip NUM leading components from file names
-d DIR –directory=DIRChange the working directory to DIR first

Additional useful option(s):

–dry-runDo not actually change any files; just print what would happen
-R –reverseAssume patches were created with old and new files swapped
–verboseOutput extra information about the work being done
-i PATCH–input=PATCRead patch from PATCH instead of stdin

Full list of options:

diff –help
Usage: diff [OPTION]… FILES Compare files line by line. -i –ignore-case Ignore case differences in file contents. –ignore-file-name-case Ignore case when comparing file names. –no-ignore-file-name-case Consider case when comparing file names. -E –ignore-tab-expansion Ignore changes due to tab expansion. -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 whose lines are all blank. -I RE –ignore-matching-lines=RE Ignore changes whose lines all match RE. –strip-trailing-cr Strip trailing carriage return on input. -a –text Treat all files as text. -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. –label LABEL Use LABEL instead of file name. -p –show-c-function Show which C function each change is in. -F RE –show-function-line=RE Show the most recent line matching RE. -q –brief Output only whether files differ. -e –ed Output an ed script. –normal Output a normal diff. -n –rcs Output an RCS format diff. -y –side-by-side Output in two columns. -W NUM –width=NUM Output at most NUM (default 130) print columns. –left-column Output only the left column of common lines. –suppress-common-lines Do not output common lines. -D NAME –ifdef=NAME Output merged file to show `#ifdef NAME’ diffs. –GTYPE-group-format=GFMT Similar, but format GTYPE input groups with GFMT. –line-format=LFMT Similar, but format all input lines with LFMT. –LTYPE-line-format=LFMT Similar, but format LTYPE input lines with LFMT. LTYPE is `old’, `new’, or `unchanged’. GTYPE is LTYPE or `changed’. GFMT may contain: %< lines from FILE1 %> lines from FILE2 %= lines common to FILE1 and FILE2 %[-][WIDTH][.[PREC]]{doxX}LETTER printf-style spec for LETTER LETTERs are as follows for new group, lower case for old group: F first line number L last line number N number of lines = L-F+1 E F-1 M L+1 LFMT may contain: %L contents of line %l contents of line, excluding any trailing newline %[-][WIDTH][.[PREC]]{doxX}n printf-style spec for input line number Either GFMT or LFMT may contain: %% % %c’C’ the single character C %c’\OOO’ the character with octal code OOO -l –paginate Pass the output through `pr’ to paginate it. -t –expand-tabs Expand tabs to spaces in output. -T –initial-tab Make tabs line up by prepending a tab. -r –recursive Recursively compare any subdirectories found. -N –new-file Treat absent files as empty. –unidirectional-new-file Treat absent first files as empty. -s –report-identical-files Report when two files are the same. -x PAT –exclude=PAT Exclude files that match PAT. -X FILE –exclude-from=FILE Exclude files that match any pattern in FILE. -S FILE –starting-file=FILE Start with FILE when comparing directories. –from-file=FILE1 Compare FILE1 to all operands. FILE1 can be a directory. –to-file=FILE2 Compare all operands to FILE2. FILE2 can be a directory. –horizon-lines=NUM Keep NUM lines of the common prefix and suffix. -d –minimal Try hard to find a smaller set of changes. –speed-large-files Assume large files and many scattered small changes. -v –version Output version info. –help Output this help. 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 FILES. If a FILE is `-‘, read standard input. Report bugs to .
patch –help
Usage: patch [OPTION]… [ORIGFILE [PATCHFILE]] Input options: -p NUM –strip=NUM Strip NUM leading components from file names. -F LINES –fuzz LINES Set the fuzz factor to LINES for inexact matching. -l –ignore-whitespace Ignore white space changes between patch and input. -c –context Interpret the patch as a context difference. -e –ed Interpret the patch as an ed script. -n –normal Interpret the patch as a normal difference. -u –unified Interpret the patch as a unified difference. -N –forward Ignore patches that appear to be reversed or already applied. -R –reverse Assume patches were created with old and new files swapped. -i PATCHFILE –input=PATCHFILE Read patch from PATCHFILE instead of stdin. Output options: -o FILE –output=FILE Output patched files to FILE. -r FILE –reject-file=FILE Output rejects to FILE. -D NAME –ifdef=NAME Make merged if-then-else output using NAME. -m –merge Merge using conflict markers instead of creating reject files. -E –remove-empty-files Remove output files that are empty after patching. -Z –set-utc Set times of patched files, assuming diff uses UTC (GMT). -T –set-time Likewise, assuming local time. –quoting-style=WORD output file names using quoting style WORD. Valid WORDs are: literal, shell, shell-always, c, escape. Default is taken from QUOTING_STYLE env variable, or ‘shell’ if unset. Backup and version control options: -b –backup Back up the original contents of each file. –backup-if-mismatch Back up if the patch does not match exactly. –no-backup-if-mismatch Back up mismatches only if otherwise requested. -V STYLE –version-control=STYLE Use STYLE version control. STYLE is either ‘simple’, ‘numbered’, or ‘existing’. -B PREFIX –prefix=PREFIX Prepend PREFIX to backup file names. -Y PREFIX –basename-prefix=PREFIX Prepend PREFIX to backup file basenames. -z SUFFIX –suffix=SUFFIX Append SUFFIX to backup file names. -g NUM –get=NUM Get files from RCS etc. if positive; ask if negative. Miscellaneous options: -t –batch Ask no questions; skip bad-Prereq patches; assume reversed. -f –force Like -t, but ignore bad-Prereq patches, and assume unreversed. -s –quiet –silent Work silently unless an error occurs. –verbose Output extra information about the work being done. –dry-run Do not actually change any files; just print what would happen. –posix Conform to the POSIX standard. -d DIR –directory=DIR Change the working directory to DIR first. –reject-format=FORMAT Create ‘context’ or ‘unified’ rejects. –binary Read and write data in binary mode. -v –version Output version info. –help Output this help. Report bugs to .

Leave a Reply

Your email address will not be published. Required fields are marked *