Сравнение hex файлов в линукс. Как сравнить файлы по содержимому в Windows или Linux? Примеры использования команды diff
), их сравнений, а также сравнений GUI-клиентов для них. Также были обсуждения плагинов к IDE для работы с git и mercurial. Но практически не было информации об инструментах визуального сравнения и разрешения конфликтов слияния.
Недавно я «перескочил» с mercurial (который до сих пор считаю более удобным и логичным) на git, потому что, подавляющее большинство проектов, которые мне интересны, используют git и хостятся на github. В связи с этим, встал вопрос о пересмотре арсенала инструментов, в частности вопрос выбора инструмента визуального сравнения и слияния (diff and merge). Дабы восполнить недостаток информации на хабре, я решил написать этот мини-обзор. Как говориться - по горячим следам.
Под катом Вы также найдете примеры настроек Git для использования с DiffMerge и WinMerge под Windows. Думаю многим сэкономит время.
Название | Особенности | Платформа |
KDiff3Git и WinMerge1) Добавим в директорию c:/Git/libexec/git-core/mergetools/файл winmerge следующего содержания: Diff_cmd () {
"c:/Program Files (x86)/WinMerge/WinMergeU.exe" \
"$LOCAL" "$REMOTE" >/dev/null 2>&1
}
merge_cmd () {
"c:/Program Files (x86)/WinMerge/WinMergeU.exe" \
"$PWD/$LOCAL" "$PWD/$REMOTE" "$PWD/$MERGED" >/dev/null 2>&1
status=$?
}
<<<<<<< HEAD
master str
=======
new str
>>>>>>> new
После этого откроется средство двухстороннего слияния: Исходя из описанной логики перепишем команду слияния merge_cmd
следующим образом: 2) Отредактируем .gitconfig
3) Создадим конфликт при слиянии двух веток (см. пример с использованием DiffMerge). Для разрешения конфликта при слиянии веток, воспользуемся командой |
), их сравнений, а также сравнений GUI-клиентов для них. Также были обсуждения плагинов к IDE для работы с git и mercurial. Но практически не было информации об инструментах визуального сравнения и разрешения конфликтов слияния.
Недавно я «перескочил» с mercurial (который до сих пор считаю более удобным и логичным) на git, потому что, подавляющее большинство проектов, которые мне интересны, используют git и хостятся на github. В связи с этим, встал вопрос о пересмотре арсенала инструментов, в частности вопрос выбора инструмента визуального сравнения и слияния (diff and merge). Дабы восполнить недостаток информации на хабре, я решил написать этот мини-обзор. Как говориться - по горячим следам.
Под катом Вы также найдете примеры настроек Git для использования с DiffMerge и WinMerge под Windows. Думаю многим сэкономит время.
Название | Особенности | Платформа |
KDiff3Git и WinMerge1) Добавим в директорию c:/Git/libexec/git-core/mergetools/файл winmerge следующего содержания: Diff_cmd () {
"c:/Program Files (x86)/WinMerge/WinMergeU.exe" \
"$LOCAL" "$REMOTE" >/dev/null 2>&1
}
merge_cmd () {
"c:/Program Files (x86)/WinMerge/WinMergeU.exe" \
"$PWD/$LOCAL" "$PWD/$REMOTE" "$PWD/$MERGED" >/dev/null 2>&1
status=$?
}
<<<<<<< HEAD
master str
=======
new str
>>>>>>> new
После этого откроется средство двухстороннего слияния: Исходя из описанной логики перепишем команду слияния merge_cmd
следующим образом: 2) Отредактируем .gitconfig
3) Создадим конфликт при слиянии двух веток (см. пример с использованием DiffMerge). Для разрешения конфликта при слиянии веток, воспользуемся командой |
Сравнение двух файлов в терминале linux (6)
Вот мое решение для этого:
Mkdir temp mkdir results cp /usr/share/dict/american-english ~/temp/american-english-dictionary cp /usr/share/dict/british-english ~/temp/british-english-dictionary cat ~/temp/american-english-dictionary | wc -l > ~/results/count-american-english-dictionary cat ~/temp/british-english-dictionary | wc -l > ~/results/count-british-english-dictionary grep -Fxf ~/temp/american-english-dictionary ~/temp/british-english-dictionary > ~/results/common-english grep -Fxvf ~/results/common-english ~/temp/american-english-dictionary > ~/results/unique-american-english grep -Fxvf ~/results/common-english ~/temp/british-english-dictionary > ~/results/unique-british-english
Есть два файла с именем «a.txt» и «b.txt», у которых есть список слов. Теперь я хочу проверить, какие слова добавлены в «a.txt» и не находятся в «b.txt» .
Мне нужен эффективный алгоритм, так как мне нужно сравнить два словаря.
Вы можете использовать инструмент diff в linux для сравнения двух файлов. Для фильтрации требуемых данных вы можете использовать опции --changed-group-format и --unchanged-group-format .
Следующие три варианта могут использовать для выбора соответствующей группы для каждой опции:
"% <" получить строки из FILE1
"%>" получает строки из FILE2
"" (пустая строка) для удаления строк из обоих файлов.
[ tmp]# cat file1.txt test one test two test three test four test eight [ tmp]# cat file2.txt test one test three test nine [ tmp]# diff --changed-group-format="%<" --unchanged-group-format="" file1.txt file2.txt test two test four test eightНапример: diff --changed-group-format = "% <" --unchanged-group-format = "" file1.txt file2.txt
Если вы предпочитаете стиль вывода diff из git diff , вы можете использовать его с флагом --no-index для сравнения файлов не в репозитории git:
Git diff --no-index a.txt b.txt
Используя пару файлов с строками имени файла размером 200 тыс. В каждом, я сравнивал (со встроенной командой time) этот подход и некоторые другие ответы здесь:
Git diff --no-index a.txt b.txt # ~1.2s comm -23 <(sort a.txt) <(sort b.txt) # ~0.2s diff a.txt b.txt # ~2.6s sdiff a.txt b.txt # ~2.7s vimdiff a.txt b.txt # ~3.2s
comm кажется, является самым быстрым на сегодняшний день, тогда как git diff --no-index представляется самым быстрым подходом для вывода в стиле diff.
Обновление 2018-03-25 Фактически вы можете опустить флаг --no-index если вы не находитесь в репозитории git и хотите сравнить невоспроизводимые файлы в этом репозитории. С man-страниц :
Эта форма предназначена для сравнения данных двух путей в файловой системе. Вы можете опустить параметр -no-index при запуске команды в рабочем дереве, контролируемом Git, и по крайней мере одну из точек пути за пределами рабочего дерева или при запуске команды за пределами рабочего дерева, управляемого Git.
Используйте comm -13 (требуется отсортированные файлы) :
$ cat file1 one two three $ cat file2 one two three four $ comm -13 <(sort file1) <(sort file2) four
Сортируйте их и используйте comm:
Comm -23 <(sort a.txt) <(sort b.txt)
comm сравнивает (сортирует) входные файлы и по умолчанию выводит три столбца: строки, которые уникальны для a, строки, которые являются уникальными для b, и строки, которые присутствуют в обоих. Указав -1 , -2 и / или -3 вы можете подавить соответствующий вывод. Поэтому comm -23 ab перечисляет только записи, которые являются уникальными для a. Я использую синтаксис <(...) для сортировки файлов на лету, если они уже отсортированы, вам это не нужно.
если у вас установлен vim, попробуйте следующее:
Vimdiff file1 file2
Vim -d file1 file2
вы найдете его фантастическим.
Сегодня меня попросили сравнить заголовки небольших абзацев в двух больших текстовых файлах. Все заголовки начинались со звёздочки, поэтому проблем не возникло. Но совсем без проблем не интересно и больше от скуки, чем для реального пользования, захотелось найти способ для вытаскивания заголовков из любого текста. К сожалению 100% рабочий способ не был найден, однако в конце статьи будет интересное решение по превращению двойных и более пустых строк в одну пустую строку.
Для начала простейший вариант, когда надо просто сравнить 2 текстовых файла.
Для этого есть команда diff. Синтаксис следующий:
diff первый_файл второй_файл
Гораздо удобнее перенаправить вывод в файл с расширением diff
diff первый_файл второй_файл > profit.diff
Если такой файл открыть в текстовом редакторе, то будет подсвечен синтаксис и процесс анализа облегчится.
Программа сравнивает строки и если в одном из файлов присутствует строка, которой нет в другом, то ставится знак «>» или «
Чтобы получить вывод строк, которые начинаются с одного символа (в данном случае это *), то лучше всего воспользоваться командой grep. Например, если нужно отправить в файл 1.txt все строки, которые начинаются с «*» в файле file.txt, то для этого следует выполнить
grep "^*" "file.txt" > 1.txt
Что касается вытаскивания заголовков из текста любого формата, то тут ничего толкового не получилось.
Но не пропадать же коду, пусть лежит тут:
#!/bin/bash
n=$1
st=`sed -n ‘/^$/p’ $n| wc -l | awk ‘{print$1}’` #считаем кол-во пустых строк
sed -nr ‘/^.{100}/!p’ $n > /tmp/copy2$n #интересуют только строки с менее чем 100 символами (вряд ли заголовки будут длиннее)
sed -n «1p» /tmp/copy2$n > ‘Заголовки ‘$n # Выносим первую строку (уж она то будет заголовком)
#
tr ‘n’ ‘^’ /tmp/copy$n # Меняем все переносы на символ ^
#
#Меняем последовательность из ^^^(и т.д.) на двойные переносы (получается пустая строка)
#А одинарный ^ меняем на одинарный перенос (без пустой строки).
sed -i ‘s/^^^^^^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^^/nn/g’ /tmp/copy$n
sed -i ‘s/^^/nn/g’ /tmp/copy$n
sed -i ‘s/^/n/g’ /tmp/copy$n
#
while [ $st -gt 0 ] #цикл на такое же кол-во раз, сколько и пустых срок.
do
st=$[$st-1]
sed -i ‘1,/^$/ d’ /tmp/copy$n #удаление всех строк до первой пустой (включая её саму)
sed -n «1p» /tmp/copy$n >> ‘Заголовки ‘$n #оставшуюся строку добавляем в файл
done
Кстати, этот код вполне справился со сравнением тех файлов, которые были мне присланы, однако с реальными книгами были проблемы.
Из-под какой бы системы мне не приходилось возиться с кодом, рано или поздно становится чересчур накладно сравнивать разные версии исходников. Здесь указаны легкие бесплатные утилитки для поиска различий в файлах под Linux, Windows и Mac. Общий формат запуска –
Под Windows с задачей сравнения содержимого файлов (да и каталогов, что порой не бесполезно) прекрасно справляется – WinMerge . Легкая. Не завязана ни на какие IDE. Писана на Qt и кроссплатформенна – должна запускаться и на никсах. Кроме файлов умеет сравнивать и содержимое директорий (в том числе на основе масок-регэкспов). Можно навешать дополнительных плагинов.
WinMerge – кросс-платформенная утилита для сравнения файлов и не только
Mac – opendiff. Представляет собой отдельный компонент XCode. Вполне себе запускается standalone из командной строчки. Различия подсвечивает бледно-серым, зато умеет кстати показывать стрелочками что куда добавилось. Может выполнять слияние (ключик -merge). Если кроме сравниваемых файлов, указать после ключа -ancestor общий файл-предок то сравнение будет производиться с ним. Умеет сравнивать папки.
утилита opendiff – бесплатное средство сравнения файлов на системе Mac
Linux – . Есть на всех платформах (Windows, Mac, Linux) за счет того что так-же написан на Qt. Умеет сравнивать до трех файлов или директорий. Поддерживает возможность слияние изменений, с поддержкой редактирования для ручного разрешения конфликтов.
Утилита kdiff3 – сравнение двух файлов
UPDATE 18.10.2013
Если в никсах вы работаете в Gnom’е то прекрасный выбор – meld . Интеграция с популярными системами контроля версий (Git, Subversion, и др.), инструменты для слияния – авто-слияние, редактирование с подхватыванием текущих различий “на лету”, подсветка синтаксиса. Есть порты для OS X Windows.
Ну а на крайняк (если ничего стороннего поставить нельзя) – на помощь приходит неказистый diff из под командной строки (предустановлен на nix-like-системах включая и Маки, и Солярисы). Гибкий. Можно долго и с упоением играться с настройками, чтобы получить возможность отображения различий на основе маски (-F), получать сравнение в привычных двух колонках (ключик –side-by-side) и т.п. Для объемных незнакомых файлов предпочитаю вывод в “контекстном” формате, когда отображаются не только измененные строчки, но и соседние с ними.
Для сравнивания более чем двух файлов может подойти diff3.