Различие между двумя похожими большими необработанными двоичными файлами

птирун и птибандаж

Существует множество доступных инструментов, которые делают то же самое, что openvtделает :открывает новый псевдо-терминал -и запускает назначенную команду со стандартным вводом-выводом, подключенным к этому псевдо-терминалу -..

  • Оригинал Дэниела Дж. Бернштейна ptyrunиptybandage
  • Мои сборки ptyrunи ptybandageна утилитах набора инструментов nosh
  • Модуль расширения zptyв оболочке Z
% tty ; ptybandage tty
/dev/pts/5
/dev/pts/6
%

Конечно, разница заключается в том, что в случае псевдотерминалов -необходимо, чтобы какой-то процесс был присоединен к главной стороне псевдотерминала -, чтобы фактически сделать что-то с ввод/вывод. В случае инструментов Бернштейна это программа ptyio. ptyrunи ptybandageна самом деле являются сценариями, которые переходят в программы ptyget, ptyioи ptyspawn. Аналогичная ситуация с моими инструментами, где программа pty-runявляется внутренней рабочей лошадкой ввода-вывода в сочетании с pty-get-ttyи open-controlling-tty.

Это означает, что если кто-то хочет более мелкой -детализированной операции, просто открывая главную сторону псевдо--терминала, а затем последовательно загружая что-то , чтобы сделать все остальное, можно вызвать pty-get-ttyили ptygetнапрямую.

терминальные мультиплексоры

В случае терминальных мультиплексоров tmuxи screen, конечно, существуют механизмы (, которые являются частью этих программ )для запуска нового (внутреннего )терминала и запуска прикрепленная к нему команда. Подробнее см. документацию по этим программам.

существующие псевдо-терминалы -

Какие инструменты (ptyrun, ptybandageи др. )делать не делать это запускать команды, присоединяя их к существующим псевдо-терминалам -. Они всегда создают свежие.

Существует небольшая потребность в выполнении команд, подключенных к существующим псевдо-терминалам -. Но это может быть сделано. Например, это можно сделать с помощью моего набора инструментов.Просто установите переменную окружения TTYна имя файла устройства подчиненной стороны существующего псевдо-терминала -и вызовите команду с помощью инструмента open-controlling-tty.

TTY=/dev/pts/5 open-controlling-tty $SHELL

Это, конечно, создает конкуренцию за терминал среди различных несвязанных параллельных процессов, и заставляет с болью осознать, как много оболочки управления заданиями делают для одного. & #9786;

Также обратите внимание, что некоторые SSH-серверы и эмуляторы терминалов закроют главную сторону, если их ведомая -дочерняя сторона завершится.

чем все это не является

Наконец, обратите внимание, что это не механизмы заполнения ввода -, для управления существующей интерактивной оболочкой на существующем псевдо-терминале -, посылая команды на его вход. Все они присоединяют новых процессов к (новым )псевдо-терминалам -.

Но ведь openvtэто тоже не то.

Дополнительная литература

  • https://unix.stackexchange.com/a/249801/5132
  • Даниэль Дж. Бернштейн (1996 ).ptyrun. djbwares .
  • Даниэль Дж. Бернштейн (1996 ).ptybandage. djbwares .
  • Даниэль Дж. Бернштейн (1996 ).ptyio. djbwares .
  • Даниэль Дж. Бернштейн (1996 ).ptyget. djbwares .
  • Джонатан де Бойн Поллард (2014 ).ptyrun. Направляющая ноша . Программное обеспечение.
  • Джонатан де Бойн Поллард (2014 ).ptybandage. Направляющая ноша . Программное обеспечение.
  • Джонатан де Бойн Поллард (2014 ).pty-run. Направляющая ноша . Программное обеспечение.
  • Джонатан де Бойн Поллард (2014 ).pty-get-tty. Направляющая ноша . Программное обеспечение.
  • Джонатан де Бойн Поллард (2014 ).open-controlling-tty. Направляющая ноша . Программное обеспечение.
  • https://unix.stackexchange.com/a/470853/5132
14
04.02.2020, 16:02
5 ответов

Для второго приложения/проблемы я бы использовал программу резервного копирования с дедупликацией, такую ​​как resticили borgbackup, а не пытался вручную отслеживать «исправления» или различия. Программа резервного копирования resticпозволяет создавать резервные копии каталогов с нескольких машин в один и тот же репозиторий резервных копий, дедуплицируя данные резервного копирования как среди фрагментов файлов с отдельной машины, так и между машинами. (У меня нет опыта работы с borgbackup, поэтому я ничего не могу сказать об этой программе.)

Вычисление и сохранение различий между файлами abcи abc2можно выполнить с помощью rsync.

Это пример, когда abcи abc2составляют 153 МБ. Файл abc2был изменен путем перезаписи первых 2,3 МБ файла некоторыми другими данными :

.
$ ls -lh
total 626208
-rw-r--r--  1 kk  wheel   153M Feb  3 16:55 abc
-rw-r--r--  1 kk  wheel   153M Feb  3 17:02 abc2

Создаем наш патч для преобразования abcв abc2и называем егоabc-diff:

$ rsync --only-write-batch=abc-diff abc2 abc
$ ls -lh
total 631026
-rw-r--r--  1 kk  wheel   153M Feb  3 16:55 abc
-rw-------  1 kk  wheel   2.3M Feb  3 17:03 abc-diff
-rwx------  1 kk  wheel    38B Feb  3 17:03 abc-diff.sh
-rw-r--r--  1 kk  wheel   153M Feb  3 17:02 abc2

Сгенерированный файл abc-diffпредставляет собой фактический diff (ваш «файл исправления» ), а abc-diff.shпредставляет собой короткий сценарий оболочки, который rsyncсоздает для вас:

$ cat abc-diff.sh
rsync --read-batch=abc-diff ${1:-abc}

Этот сценарий модифицирует abc, чтобы он стал идентичен abc2, учитывая файлabc-diff:

$ md5sum abc abc2
be00efe0a7a7d3b793e70e466cbc53c6  abc
3decbde2d3a87f3d954ccee9d60f249b  abc2
$ sh abc-diff.sh
$ md5sum abc abc2
3decbde2d3a87f3d954ccee9d60f249b  abc
3decbde2d3a87f3d954ccee9d60f249b  abc2

Файл abc-diffтеперь можно перенести в другое место, которое у вас есть abc. С помощью команды rsync --read-batch=abc-diff abcвы примените патч к файлу abc, преобразовав его содержимое так, чтобы оно совпадало с файлом abc2в системе, где вы создали diff.

Re -применение патча во второй раз кажется безопасным.Сообщений об ошибках нет и содержимое файла не меняется (контрольная сумма MD5 не меняется ).

Обратите внимание, что если вы не создадите явный «обратный патч», нет возможности легко отменить применение патча.


Я также протестировал запись модификации 2,3 МБ в какое-то другое место в данных abc2, немного дальше в (примерно на 50 МБ ), а также в начале. Сгенерированный «патч» имел размер 4,6 МБ, что позволяет предположить, что в патче были сохранены только измененные биты.

18
28.04.2021, 23:24

Пробовали ли вы просто заставить diffобрабатывать файлы как текст:

diff -ua abc abc2

Как объяснено здесь .

  • -uвывод ЧИСЛО (по умолчанию 3 )строки единого контекста
  • -aобрабатывать все файлы как текст

Вы получите патч. Недостатком этого является то, что «линии» могут быть довольно длинными, и это может раздуть патч.

2
28.04.2021, 23:24

How to compute a binary diff of abc and abc2?

Использование bsdiff/bspatch или xdelta и других.

$ bsdiff older newer patch.bin     # patch.bin is created
[...]
$ bspatch older newer patch.bin    # newer is created

Тем не менее, следует принять к сведению эти предостережения из справочных страниц.:

  • bsdiffиспользует память, в 17 раз превышающую размер oldfile , и требует абсолютного минимального размера рабочего набора, в 8 раз превышающего размер oldfile .
  • bspatchиспользует память, равную размеру oldfile плюс размер newfile , но может работать с очень маленьким рабочим набором без существенного потеря производительности.
4
28.04.2021, 23:24

Дополнения к другим ответам согласно моим тестам:

Сdiff

Я создал два очень похожих файла по 256 МБ abcи abc2. Затем создадим файл различий:

diff -ua abc abc2 > abc-abc2.diff

Теперь попробуем восстановить abc2благодаря оригинальному файлу abcиabc-abc2.diff:

cp abc abc3
patch abc3 < abc-abc2.diff

или

cp abc abc3
patch abc3 -i abc-abc2.diff

или

patch abc -i abc-abc2.diff -o abc3

Работает в Linux. Я также пробовал в Windows (patch.exe и diff.exe также доступны ), но по неизвестной причине это не удалось :полученный abc3файл имеет размер всего 1 КБ вместо 256 МБ (Я обновить этот ответ позже здесь ).

Сrsync

Как подробно описано в принятом ответе, это работает:

rsync --only-write-batch=abc-abc2-diff abc2 abc

cp abc abc3

rsync --read-batch=abc-abc2-diff abc3 

Сrdiff

Как подробно описано в этом ответе , это тоже решение:

rdiff signature abc abc-signature
rdiff delta abc-signature abc2 abc-abc2-delta

rdiff patch abc abc-abc2-delta abc3

Также протестировано в Windows с помощью rdiff.exe из здесь , все работает.

0
28.04.2021, 23:24

Используйте xdelta , он был создан именно для этого типа использования. На основе VCDIFF (RFC 3284 )в последних версиях.

1
28.04.2021, 23:24

Теги

Похожие вопросы