- Команда diff в Linux: сравниваем два файла
- Что из себя представляет команда diff в Linux?
- Синтаксис команды diff
- Примеры использования команды diff
- Синтаксис команды patch
- Примеры использования команды patch
- Итоги
- Linux diff – How to Show Differences and Make Patches, With Examples
- diff Syntax
- diff Options
- Examples
- Comparing Files with diff in Linux
- Redirecting the Output
- Comparing Directories with diff
- Comparing Large Files or Directories Containing Large Files
- Creating a Patch for a File
- Installing a Patch for a File
- Undoing a Patch for a File
- Creating a Patch for a Directory
- Installing a Patch for a Directory
- Undoing a Patch for a Directory
- 7 Patch Command Examples to Apply Diff Patch Files in Linux
- 1. Create a Patch File using diff
- 2. Apply Patch File using Patch Command
- 3. Create a Patch From a Source Tree
- 4. Apply Patch File to a Source Code Tree
- 5. Take a Backup before Applying the Patch using -b
- 6. Validate the Patch without Applying (Dry-run Patch File)
- 7. Reverse a Patch that is Already Applied (Undo a Patch)
Команда diff в Linux: сравниваем два файла
Представьте, что однажды утром вы просыпаетесь и обнаруживаете, чтоб ваши продакшен-системы «лежат» из-за бага, который только предстоит найти. Один из наихудших кошмаров, верно?
Также оказывается, что для восстановления системы вам нужно сравнить код в двух версиях. Давление растет, все вокруг паникуют (и это понятно).
К счастью, в Linux есть утилита под названием diff, которая вам поможет.
Что из себя представляет команда diff в Linux?
Сравнение файлов и поиск различий между ними — широко распространенная операция. Она особенно полезна, когда нужно сравнить сложный код или конфигурационные файлы.
Сравнивать вручную долго и тяжело, к тому же велика вероятность ошибок. Поэтому Linux предоставляет вам мощную встроенную утилиту под названием diff. Ее применение позволяет сэкономить время и силы.
В Linux также есть еще одна команда, которая отлично дополняет diff, — patch. Она позволяет применить изменения из одного файла в другом. В этой статье мы рассмотрим обе команды и их применение на практике.
Синтаксис команды diff
Команда diff имеет следующий синтаксис:
Команда diff сравнивает два файла построчно. При этом первый из файлов она считает нуждающимся в редактировании и приведении к виду второго файла. Второй файл для diff — образец для сравнения.
Поэтому в выводе команды даются указания, что и как нужно изменить, чтобы первый файл стал таким же, как второй.
Указания даются при помощи специальных символов:
- c — CHANGE — изменение, которое нужно внести в указанной строке первого файла
- d — DELETE — то, что нужно удалить в первом файле
- a — ADD — то, что нужно добавить в первый файл
Давайте рассмотрим несколько примеров использования команды diff.
Примеры использования команды diff
Чтобы выяснить, являются ли файлы одинаковыми, команда diff дополняется флагом -s . В нашем примере содержимое файлов fileA и sameAsfileA совпадает.
А в следующем примере файлы имеют разный контент. Вывод команды diff говорит, что строки 11 и 14 в showList_v2.js нужно изменить, чтобы они совпадали со строками 11 и 13 в showList_v1.js.
Далее мы рассмотрим мой любимый способ использования команды diff — параллельный просмотр изменений. Для этого нужно применить флаг -y:
И последний пример — с объединенным выводом. Такой output часто используется как input для команды patch (ее мы тоже рассмотрим):
Вот еще несколько полезных флагов, которые можно применять с командой diff:
- -i — для игнорирования регистра. По умолчанию команда diff учитывает регистр.
- -w — для игнорирования пробелов в файле. По умолчанию пробелы тоже учитываются и могут считаться различием.
Синтаксис команды patch
Изменения в коде происходят постоянно. Расшаривать отредактированные файлы после внесения каждого изменения нереально. Обычно разработчики расшаривают сами изменения в коде.
Использование патчей («заплаток») — самый безопасный способ делиться только лишь изменениями.
Давайте посмотрим, как работают патчи:
Примеры использования команды patch
Предположим, у нас есть простой JavaScript-код в файле print_in_js.js, который выводит строку.
Но в функции вывода что-то сломалось, и нам нужно внести исправления. Мы отсылаем файл print_in_js.js коллеге, который может исправить код.
Наш коллега находит опечатку в строке № 3 и исправляет файл.
Когда файл исправлен и код работает корректно, наш коллега создает патч:
diff -u print_in_js.js print_in_js_Fixed.js > patched_print_js.diff
Давайте посмотрим содержимое патча:
Получив патч, мы применяем его:
И — вуаля! — наш код исправлен!
Итоги
Создавать и применять патчи при помощи команд patch и diff довольно просто.
Похожий подход применяется, когда вы пользуетесь системами контроля версий вроде Git или SVN. Знание основ (т. е. работы соответствующих команд Linux) поможет вам лучше понять работу систем контроля версий, а это важно для разработчиков.
Linux diff – How to Show Differences and Make Patches, With Examples
The diff command is an easy way to compare files or directories from the Linux shell. This article will show you how to use it, with some examples of common usage.
The diff command performs a line-by-line comparison of two files or directories and outputs the differences between them.
Why would you want to compare files or directories?
- You might have two files with the same name that look similar and want to see the difference between them.
- Comparing changes to the programming code in a project you’re building between a new and old version.
- You’ve copied many files to another drive and want to make sure everything is copied successfully and without corruption.
- You and a friend both have the same set of files in a folder. You have made changes to yours, but don’t want to send all of them to your friend again. You can use diff to create a patch containing only the changes made to those files, send it to them, and then bring their copy up to date without having to re-download everything.
You’ll probably have your own reasons for comparing files, so on to diff and how to use it.
diff Syntax
- OPTIONS are optional and can be supplied from the below table
- FILES is the path to two files to be compared, separated by spaces
diff Options
Here are the most commonly used OPTIONS for the diff command, straight from the user manual:
-q, –brief | Report only when files differ |
-s, –report-identical-files | Report when two files are the same |
-u, -U NUM, –unified[=NUM] | output NUM (default 3) lines of unified context |
-N –new-file | Treat absent files as empty |
-l, –paginate | Pass output through ‘pr’ to paginate it |
-r, –recursive | Recursively compare any subdirectories found |
–no-dereference | Don’t follow symbolic links |
-a, –text | Treat all files as text |
-d, –minimal | Try hard to find a smaller set of changes |
–speed-large-files | Assume large files and many scattered small changes |
…from the command line for a full set of options.
Examples
Comparing Files with diff in Linux
This is the simplest usage of the diff command and will output the difference between the two supplied files to the console:
Redirecting the Output
If you are simply looking to view the differences rather than creating a patch, simply redirecting the output to a file is useful – so that the terminal doesn’t cut off any changes if there are a lot of them:
diff -q file1.txt file2.txt > differences.txt
This will create (or overwrite!) differences.txt, which will summarize the differences between the two files.
The -q options has been added so that only the differences are listed; files that are the same won’t be mentioned to make it easier to see what’s happening.
Comparing Directories with diff
Directories can also be compared using the -r (recursive) option to compare their contents:
diff -r -q /path/to/dir1 /path/to/dir2
Again, I have used the -q option here so that only differences are listed.
Comparing Large Files or Directories Containing Large Files
diff is an intensive process – every file being compared needs to be read and compared. It can take a while.
The –speed-large-files option alters diff’s algorithm to make it more efficient if you are comparing large files – speeding things up a bit.
Creating a Patch for a File
To create a patch – a list of differences between two files that can be applied to another copy of the first file to make it identical to the second, the following command can be used:
diff -u file1.txt file2.txt > update.patch
The -u option outputs the differences in a unified format which can be used by the patch command to update the original file with the changes.
This is useful if you have a friend or colleague who is using some of your data or programming code, and you want to send them updates you’ve made without sending over the whole dataset or application again.
Installing a Patch for a File
When your friend receives the patch, they can apply it using the following patch command:
Undoing a Patch for a File
If you made a mistake, you could undo a patch by running it in reverse with the -R option:
Creating a Patch for a Directory
The following command will create a patch for an entire directory by running the -r (recursive), -u (unified format), and -N (treat absent files as empty) options.
diff -ruN originalDir updatedDir > update.patch
Installing a Patch for a Directory
A patch can be applied to a directory using the -p0 option, which will apply the patch to the same directory structure as it was created in:
Undoing a Patch for a Directory
Finally, undoing/reversing the patching of a directory:
7 Patch Command Examples to Apply Diff Patch Files in Linux
When there is a security fix available for a particular software, we typically do a binary upgrade using the package management tools like yum or apt-get. But, there might be situation where you have installed a software by compiling it from the source code. In those situation, how do you apply the security fix to the software? The answer is to download the security patch and apply it to the original source code and re-compile the software. This tutorial explains how to create a patch file using diff, and apply it using patch command.
A patch file is a text file which contains the differences between two versions of the same file (or same source-tree). Patch file is created by using diff command.
1. Create a Patch File using diff
#include int main(int argc, char *argv[])
$ diff -u hello.c hello_new.c > hello.patch
— hello.c 2014-10-07 18:17:49.000000000 +0530 +++ hello_new.c 2014-10-07 18:17:54.000000000 +0530 @@ -1,5 +1,6 @@ #include -int main()
2. Apply Patch File using Patch Command
The “patch” command takes a patch file as input and apply the differences to one or more original file(s), producing patched versions.
The hello.patch file contains the name of the file to be patched. Once the file is patched, both hello.c and hello_new.c will have the content.
3. Create a Patch From a Source Tree
The above example was so simple that it works only with one file. We will see how to create and apply patch for a complete source tree by taking “openvpn” source code as example. I’ve downloaded 2 version of openvpn, openvpn-2.3.2 and openvpn-2.3.4.
tar -xvzf openvpn-2.3.2.tar.gz tar -xvzf openvpn-2.3.4.tar.gz
diff -Naur /usr/src/openvpn-2.3.2 /usr/src/openvpn-2.3.4 > openvpn.patch
The above command will operate recursively and find the differences, and place those differences in the patch file.
4. Apply Patch File to a Source Code Tree
Please note that we are executing the command from /usr/src/. The patch file contains all the filenames in absolute path format( from root ). So when we execute from /usr/src, without the “-p” option, it will not work properly. -p3 tells the patch command to skip 3 leading slashes from the filenames present in the patch file. In our case, the filename in patch file is “/usr/src/openvpn-2.3.2/aclocal.m4”, since you have given “-p3”, 3 leading slashes, i.e. until /usr/src/ is ignored.
5. Take a Backup before Applying the Patch using -b
You can take a backup of the original file before applying the patch command using the -b option as shown below.
Now you will have a file name “hello.c.orig”, which is the backup of the original hello.c. You can also use -V to decide the backup filename format as shown below. Now you will have a file name “hello.c.~1~”.
6. Validate the Patch without Applying (Dry-run Patch File)
You can dry run the patch command to see if you are getting any errors, without patching the file using –dry-run option as shown below.
7. Reverse a Patch that is Already Applied (Undo a Patch)
You can notice from the filesize, that the patch, which is applied already is reversed when we used the -R option.