Сравнить 2 файла побайтно
От переводчика: В блоге Войтеха Рузички по программированию имеется 13 постов с тегом IDEA. Один из был переведен и опубликован на Хабре — Лучшие плагины IntelliJ IDEA. Он оказася довольно популярен и я решил попробовать перевести и другие посты об IDEA. Надеюсь будут полезны для вас.
IntelliJ IDEA предлагает множество способов сравнения файлов, папок и фрагментов кода и даже синхронизации содержимого папок.
Собственное сравнение
Как насчет случая, когда вы хотите сравнить два фрагмента кода из внешних источников? Вы тоже можете это сделать! Просто запустите Find Action с помощью Ctrl + Shift + A и затем найдите опцию Open Blank Diff Window в контекстном меню.
Откроется новое окно сравнения с пустыми обеими панелями, так что вы сможете скопировать и вставить оба фрагмента для сравнения.
Сравнение с файлом вне проекта
Второй пример, когда вам нужно сравнить файл из вашего проекта с другим файлом вне его.
Процесс очень похож на описанный выше. Выберите один файл в окне вашего проекта и:
- Щелкните правой кнопкой мыши один из файлов и выберите в меню опцию «Compare With. »
- Нажмите Ctrl + D
Последний шаг — поиск внешнего файла для сравнения. Далее сравнение происходит так же, как и в примере выше.
Текстовые файлы
И так, начать заметку (я думаю) стоит с самых обычных текстовых файлов (коих большинство). Задача перед нами будет следующая : есть два почти одинаковых текстовых файла (в формате TXT), и нужно найти в них отличные строки и символы, и подсветить их (о чем я и сказал выше).
Для работы нам понадобится блокнот 👉 Notepad++ (ссылка на офиц. сайт) . Установка у программы стандартная (поэтому ее опускаю).
Далее делаем следующее:
-
запускаем Notepad++ и открываем меню "Плагины / управление плагинами" — в списке плагинов находим "Compare" и соглашаемся на его установку (см. пример ниже 👇);
Устанавливаем плагин в Notepad++
Открываем два нужных файла и жмем кнопку сравнения
Места, где есть различия, были выделены! // Notepad++
Картинки
Вообще, две картинки чаще всего сравнивают просто на "глазок", ставя их одну к одной. Впрочем, для этого можно использовать и спец. утилиты — например, те, которые используются для поиска дубликатов файлов. Я на страницах блога как-то упоминал о них, ссылка ниже в помощь.
Обратите внимание , программа Image Comparer 👇 автоматически выделят на картинках те области, к которым стоит присмотреться (либо есть различие, либо они не четкие и нельзя точно сказать наверняка. ).
Сравнение папок
Сравнение работает не только для отдельных файлов, но и для целых каталогов. Процесс такой же, как и для файлов — просто выберите две папки в окне вашего проекта и нажмите Ctrl + D или щелкните правой кнопкой мыши и выберите Compare Directories в контекстном меню.
Здесь вы можете увидеть список всех файлов, присутствующих в обоих или в одном из каталогов. Вы можете легко определить, какие файлы присутствуют только в одной папке, а какие в обеих. Файлы в обоих папках вы можете сравнить, как обычно.
Сравнение с предыдущей локальной версией файла
Даже если вы не используете какую-либо систему контроля версий, IDEA хранит исторические версии ваших локальных файлов. Вы можете щелкнуть правой кнопкой мыши в вашем редакторе и выбрать Local history → Show history в контекстном меню.
Здесь вы можете просмотреть более старые версии вашего текущего файла и увидеть разницу между старой и текущей версией и применить любые изменения, если это необходимо.
Сравнение файлов проекта
Допустим, в вашем проекте есть два похожих файла, и вам нужно сравнивать их построчно. С IDEA это очень просто. Просто выберите оба файла в окне вашего проекта (удерживая Ctrl для множественного выбора).
Теперь у вас есть два варианта:
- Щелкните правой кнопкой мыши один из файлов и выберите в меню опцию «Compare Files».
- Нажмите Ctrl + D
После чего открывается новое окно, которое содержит две панели, в каждой из которых отображается содержимое одого файла. Это очень похоже на diff в системах контроля версий, таких как Git.
Каждое отличие имеет цветовую кодировку:
- Отсутствие окраски означает, что содержание одинаково
- Синий означает наличие изменений в той же строке
- Зеленый означает новый контент
- Серый означает удаленный контент
Вы можете нажать иконки со стрелками » и «, чтобы применить конкретное изменение из одного файла в другой.
Cравнение работает и для изображений, хотя вы не можете видеть и использовать индивидуальные различия.
Нюансы: о каких файлах идет речь
Сравнение с буфером обмена
Возможно, у вас есть файл в вашем проекте, и вам нужно сравнить его с некоторым внешним контентом, который не сохраняется как файл на вашем компьютере. Может быть, это фрагмент кода из Интернета, например, с сайта stackoverflow.
Во-первых, вам нужно открыть файл из вашего проекта в вашем редакторе. Затем скопируйте в буфер обмена фрагмент, который вы хотите сравнить (Ctrl + C).
Теперь у вас есть два варианта. Либо сравните весь файл с буфером обмена, либо сравнить выделенный текст.
- Если вы хотите, чтобы весь файл сравнивался, просто щелкните правой кнопкой мыши в любом месте редактора и выберите «Compare with Clipboard» в контекстном меню.
- Если вы хотите сравнить только выделенный текст, сначала выберите какой-то фрагмент файла, а затем щелкните правой кнопкой мыши, как и раньше.
Документы Word / Excel (+ текстовые в т.ч.)
Начну с MS Word.
Программа универсальная и позволяет сравнивать как документы формата Docx, так и обычные текстовые файлы (TXT, RTF и пр. форматы).
Делается это так (на примере Word 2019):
-
сначала необходимо открыть оба файла в Word (как правило достаточно по нужному файла кликнуть правой кнопкой мыши и в меню указать, что требуется открыть в Word, см. пример ниже 👇) ;
Открываем 2 файла в Word
Рецензирование - Сравнить (Word 2019)
Что получается в итоге // Word подсчитал сколько было мест с исправлениями (в моем случае 8!).
👉 Что касается Excel
С одной стороны — в Excel есть десятки способов, как можно сравнить две таблички между собой, с другой — в зависимости от конкретной задачи в каждом случае нужно "всё подгонять" под себя (универсального способа на все случаи жизни - нет!). 👌
Ниже приведу лишь парочку наиболее простых вариантов (разумеется, есть много др. способов решения).
-
для начала необходимо скопировать (сочетания в помощь: Ctrl+C / Ctrl+V) обе таблички на один лист в Excel (в качестве примера у меня табличка с именами 👇);
Пример двух табличек
Выделяем таблицы, и вкл. повторяющиеся значения
Все отличия были найдены!
В Excel есть одна довольно мощная функция ВПР — она позволяет сравнивать 2 таблицы и при нахождении чего-то "несовпадающего" — выполнять условие (скажем, подставить значение из одной таблицы в другую). О том, как с ней работать — показано в одной моей прошлой статье (парочка ссылок ниже).
👉 В помощь!
1) Excel: как сравнить 2 таблицы с помощью функции ВПР — см. простейший пример.
2) Повторяющиеся значения в Excel: как удалить дубликаты / уникальные строки.
Синхронизация папок
Инструмент сравнения каталогов полезен не только для выявления различий в обоих каталогах, но и для синхронизации изменений. Вы можете применить изменения для отдельных разделов каждого файла, как обычно. Но вы также можете пометить файлы, присутствующие только в одном из каталогов, для сохранения или синхронизации с другим каталогом. Вы можете изменить желаемое действие для каждого файла в столбце *. Как только вы закончили свой выбор, вы можете нажать либо Synchronize selected, либо Synchronize all для выполения нейобходимой синхронизации.
Команда COMP позволяет сравнить содержимое двух или нескольких файлов.
Формат командной строки:
COMP [данные1] [данные2] [/D] [/A] [/L] [/N=число] [/C]
Параметры командной строки:
данные1 - Первый файл или набор файлов для сравнения.
данные2 - Второй файл или набор файлов для сравнения.
/D - Вывод различий в десятичном формате
/A - Вывод различий в формате ASCII.
/L - Вывод номеров строк, в которых обнаружены различия.
/N=число - Число первых строк в каждом файле, которые следует сравнить.
/C - Сравнение файлов без учета регистра букв ASCII.
/OFF[LINE] - Не пропускать файлы с установленным атрибутом "Автономный".
Для указания наборов файлов могут использоваться подстановочные символы.
Если в команде COMP не заданы параметры, то они будут запрошены в диалоговом режиме.
Для получения краткой справки используется параметр /? : COMP /?
При завершении текущей операции сравнения, пользователю выдается запрос на продолжение или завершение работы:
Сравнить другие файлы [Y(да)/N(нет)]?
Сравнение данных выполняется побайтно, и после обнаружения 10 различий в сравниваемых файлах, прекращается.
comp textfile1.txt textfile2.txt - сравнить файлы textfile1.txt и textfile2.txt в текущем каталоге.
comp C:\textfile1.txt %temp%\textfile2.txt - сравнить файл textfile1.txt находящийся в корневом каталоге диска C: , с файлом textfile2.txt в каталоге временных файлов.
При различии в длине сравниваемых файлов, можно воспользоваться параметром /N= для задания числа строк для сравнения:
comp textfile1.txt textfile2.txt /N=10 - сравнить 10 строк файла textfile1.txt и файла textfile2.txt в текущем каталоге.
comp textfile1.txt textfile2.txt | more - сравнение 2-х файлов с выдачей результатов на экран в постраничном режиме.
comp a*.html D:\comp.txt /N=20 /C > D:\comprezult.txt - сравнить первые 20 строк всех файлов текущего каталога c расширением html , имена которых начинаются с символа a с содержимым файла D:\comp.txt . Результаты сравнения перенаправляются в файл D:\comprezult.txt
Команда FC позволяет сравнить содержимое двух или нескольких файлов.
Формат командной строки:
FC [/A] [/C] [/L] [/LBn] [/N] [/OFF[LINE]] [/T] [/U] [/W] [/nnnn][диск1:][путь1]имя_файла1 [диск2:][путь2]имя_файла2
или
FC /B [диск1:][путь1]имя_файла1 [диск2:][путь2]имя_файла2
/A - Вывод только первой и последней строк для каждой группы различий.
/B - Сравнение двоичных файлов.
/C - Сравнение без учета регистра символов.
/L - Сравнение файлов в формате ASCII.
/Lbn - Максимальное число несоответствий для заданного числа строк.
/N - Вывод номеров строк при сравнении текстовых файлов ASCII.
/OFF[LINE] - Не пропускать файлы с установленным атрибутом "Автономный".
/T - Символы табуляции не заменяются эквивалентным числом пробелов.
/U - Сравнение файлов в формате UNICODE.
/W - Пропуск пробелов и символов табуляции при сравнении.
/nnnn - Число последовательных совпадающих строк, которое должно встретиться после группы несовпадающих.
[диск1:][путь1]имя_файла1 - Указывает первый файл или набор файлов для сравнения.
[диск2:][путь2]имя_файла2 - Указывает второй файл или набор файлов для сравнения.
Для получения краткой справки используется параметр /? : FC /?
Если в командной строке не задан параметр /B то сравнение выполняется построчно, с выводом результатов в виде имен файлов и несовпадающих строк:
Сравнение файлов FILE1.TXT и FILE2.TXT
line1
line2
head
В приведенном примере не совпало содержимое первых 2-х строк в файлах FILE1.TXT и FILE2.TXT. Кроме не совпавших строк, в результатах сравнения отображается первая совпавшая после них строка ( head )
Если выполняется команда сравнения двоичных файлов FC /B , то независимо от формата данных, выполняется побайтное сравнение с выдачей результатов в виде:
Сравнение файлов file1.txt и file2.txt
00000001: 6C 31
00000002: 69 44
Строка 00000001: 6C 31 - означает, что смещение от начала файла равно 00000001 . В файле file1.txt поданному смещению находится байт с шестнадцатеричным значением 6C , а в файле file2.txt - 31
Примеры использования FC.EXE:
fc /b etalon.exe C:\windows\system32\notepad.exe - сравнить двоичный файл etalon.exe из текущего каталога с файлом C:\windows\system32\notepad.exe
fc /b D:\windows\system32\dllcache\*.exe D:\windows\system32\*.* | more - сравнить группы двоичных файлов с расширением exe из каталога D:\windows\system32\dllcache\ с файлами из каталога D:\windows\system32\ . Благодаря использованию команды FC в цепочке с командой more , выдача результатов на экран выполняется в постраничном режиме.
fc C:\Documents\*.txt D:\documents\*.* > C:\compare.txt - сравнить текстовые файлы в разных каталогах с записью результатов в файл C:\compare.txt.
FC /LB2 C:\Documents\*.txt D:\documents\*.* > C:\compare.txt - как и в предыдущем случае, но в результатах сравнения будут отображаться не более 2-х несовпадений.
Параметр /nnn позволяет управлять продолжением выполнения сравнения файлов. Например, имеется 2 текстовых файла file1.txt и file2.txt, в которых 1-я и 4-я строки различаются, а 2-я и 3-я - совпадают. В зависимости от значения /nnn утилита FC.EXE может либо прекратить дальнейшее сравнение файлов, либо продолжить:
FC /2 file1.txt file2.txt - после первой не совпавшей строки имеются 2 совпавшие ( 2-я и 3-я строки - одинаковые) - сравнение файлов будет продолжено.
FC /3 file1.txt file2.txt - параметр /3 требует наличия 3- х совпадающих строк после несовпадения, поэтому дальнейшее сравнение файлов будет прекращено.
FC /A /L /C file1.txt file2.txt - выполнить сравнение текстовых файлов в формате ASCII , без учета регистра символов, с отображением только первой и последней строк для каждой группы различий.
В командных файлах, для проверки результата сравнения файлов используется анализ значения переменной ERRORLEVEL.
По результату выполнения операции сравнения, переменная ERRORLEVEL может принимать следующие значения:
0 - файлы совпали.
1 - файлы не совпали
2 - ошибка открытия файла ( файл не найден)
Пример командного файла :
@echo off
fc file1.txt file2.txt > nul
if ERRORLEVEL 1 goto Different
echo Файлы совпадают
REM подпрограмма, выполняющаяся при совпадении файлов. . .
exit
:Different
echo Файлы НЕ совпадают
REM подпрограмма, выполняющаяся при различии файлов. . .
Дальше — больше. Прошу проделать ту же самую процедуру моего коллегу, на его компьютере. Он пробует — и у него всё работает! Но как же так? Одна версия приложения, один и тот же файл с билд-сервера. Какая-то разница в окружении? Сажусь за компьютер коллеги, пробую ещё раз — не работает! Он в этом время пробует на моём — работает! То есть получается, что файл «помнит», кто его разархивировал! Зовём третьего коллегу понаблюдать этот цирк. Последовательно, на одном и том же компьютере, по очереди делаем одни и те же действия: скачиваем архив с плагином, разархивируем в нужную папку, запускаем приложение. Когда это делаю я — программа не видит плагин, когда это делает коллега — всё работает. На третьем круге этих интересных экспериментов вдруг замечаем разницу в действиях: я разархивировал плагин стандартными средствами Windows, а мой коллега — с помощью 7-Zip. И то и другое вызывалось нами из контекстного меню архива, так что разницу в клик по не тому пункту вначале никто не замечал. Ну ок. Получается, файл, извлечённый из zip-архива с помощью 7-zip, отличается от того же файла из того же архива, извлечённого с помощью стандартного архиватора Windows?
Кстати, пока вы не открыли статью под катом, ответьте-ка сами для себя на вопрос, может ли такое быть, что содержимое файлов валидного zip-архива при разархивации 7-zip и через проводник Windows будет разным?
Ну, не будем гадать и сравним файлы с помощью WinMerge:
А теперь будет страшная правда
При загрузке файла из интернета Windows ставит на него специальный «флаг», означающий зону доверия, соответствующую сайту, с которого он был загружен. Я думаю, многие видели при попытке запуска только что скачанного исполняемого файла предупреждения о том, что запускать его, возможно, не стоит, надо подумать, вот посмотрите сертификат и скажите, что делать. В зависимости от политик безопасности и происхождения файла уровень параноидальности этих предупреждений может быть разным — от полного их отсутствия (работаем под админом, UAC отключен, файл подписан) до блокировки запуска (корпоративное окружение, неподписанный файл). Есть и несколько промежуточных стадий, где надо один или несколько раз сказать «да, запускаем». Но это всё ведь работает только для exe-файлов, да? Нет! На скачанный из интернета dll-файл или архив тоже будет повешен данный флаг! С технической точки зрения он является альтернативным файловым потоком NTFS, который можно посмотреть, например, через утилиту AlternateStreamView ну или через команду:
И вот здесь мы имеем стечение следующих обстоятельств:
Если вы сделаете это для архива до извлечения из него файлов — идентификатор зоны пропадёт и для всех извлеченных в последствии файлов.
Приветствую всех читателей!
Сегодняшняя заметка будет относиться к офисной тематике. (а точнее: речь пойдет о сравнении нескольких документов между собой).
Представьте , у вас есть парочка документов, в которых частично различается текст (например, где-то уже исправленный, а где-то "старый", с ошибками. ). И теперь нужно найти между ними различия, принять их к сведению, и собрать из 2-х файлов один.
Можно, конечно, сориентироваться по дате — однако, далеко не всегда такой подход будет уместен. Но вот если бы какая-то программа нашла и выделила несовпадающие символы (строки). это было бы здорово! 👌
Собственно, о нескольких подобных примерах и пойдет речь в этой заметке.
Др. бинарные файлы Exe, Com и пр. (возможно без расширения)
Тема очень специфичная, и я включил ее в заметку только для общей информации.
Сравнить два EXE-файла (или любых других, у которых нет расширения, и вы даже не знаете их тип данных) можно с помощью спец. редактора шестнадцатеричных, десятичных и бинарных файлов. Например, один из доступных для начинающих — это 👉 Hex Editor Neo (ссылка на сайт разработчика).
Как с ней работать : сначала необходимо запустить программу и открыть в ней оба файла (это стандартно, как и в др. софте). Далее перейти в раздел "Tools / File Comparison / Compare Files" . 👇
Hex Editor Neo — инструмент сравнения
В результате Hex Editor Neo автоматически разделит экран поровну на две части и подсветит несовпадающий код. 👇
Разумеется, для дальнейшего редактирования и более-менее осмысленной работы — необходимы определенные знания / либо точно знать, какой кусок нужно удалить, поменять (можно, конечно, поэкспериментировать. но результаты могут быть самыми разными — от ошибок при запуске отредактированного файла, до "вылетов" синих экранов).
Сравнить с использованием VCS
Если вы используете систему контроля версий (VCS), у вас есть еще несколько вариантов сравнения. Например, если вы используете Git, вы можете перейти к VCS → Git или щелкнуть правой кнопкой мыши на вашем редакторе и выбрать Git. Теперь вы можете:
- Сравнить с той же версией репозитория: сравнивает текущий локальный файл с версией в вашем удаленном репозитории
- Сравнить с веткой: сравнивает локальный файл с тем же файлом в другой ветке
- Показать историю: сравнивает локальный файл с его предыдущими версиями
Читайте также: