Linux command: Diff/Patch

·

2 min read

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