Linux command: Diff/Patch

魔法偽娘帕秋莉
2 min readNov 18, 2021

diff will calculate the difference of two files or folders and output with specific format. patch parse that specific format and apply difference to files or folders.

Example for Files

Here we prepare two files: file1.old.cpp and file1.new.cpp

// file1.old.cpp
#include <iostream>
int main() {
return 0;
}
// file1.new.cpp
#include <iostream>
int main() {
std::cout << "hello world" << std::endl;
return 0;
}

Then the command can be:

diff -Naur file1.old.cpp file1.new.cpp > patch.diff

The patch.diff will be:

--- file1.old.cpp    2021-11-03 14:32:34.000000000 +0800
+++ file1.new.cpp 2021-11-03 14:33:00.000000000 +0800
@@ -1,5 +1,6 @@
#include <iostream>
int main() {
+ std::cout << "hello world" << std::endl;
return 0;
}
\ No newline at end of file

-Naur Parameters

  • N: Treat removed file as empty.
    This parameter allow patch command to remove or create files.
  • a: Allow calculating difference of binary file.
  • r: Recursively visit the folder tree.
  • u: Specific format output of difference.

-u: Specific format

Without this parameter, we’ll get the format below, and the patch command cannot parse it.

$ diff file1.old.cpp file1.new.cpp > patch.diff
$ cat patch.diff
3a4
> std::cout << "hello world" << std::endl;
$ patch -p0 < patch.diff
patch: **** Only garbage was found in the patch input.

Example for Folder

old
├── main.cpp (file1.old.cpp)
└── legacy
└── 1.txt
new
└── main.cpp (file1.new.cpp)

This example has a absent file: old/legacy/1.txt and diff treat new/legacy/1.txt as an empty file with timestamp = unix time 0.

diff -Naur old/legacy/1.txt new/legacy/1.txt
--- old/legacy/1.txt 2021-11-03 14:47:46.000000000 +0800
+++ new/legacy/1.txt 1970-01-01 08:00:00.000000000 +0800
@@ -1 +0,0 @@
-123
\ No newline at end of file
diff -Naur old/main.cpp new/main.cpp
--- old/main.cpp 2021-11-08 11:55:32.000000000 +0800
+++ new/main.cpp 2021-11-08 11:55:35.000000000 +0800
@@ -1,5 +1,6 @@
#include <iostream>
int main() {
+ std::cout << "hello world" << std::endl;
return 0;
}
\ No newline at end of file

Patch

Patch old version to new version:

diff -Naur file1.old.cpp file1.new.cpp > patch.diff
patch -p0 < patch.diff

“Patch” new version to old version:

patch -p0 < patch.diff -R

Reference

--

--