LINUX.ORG.RU

Как сравнить побайтово два огромных каталога?

 


2

2

Снова о нерешенном. Весь гуголь забит описаниями программ, например, diff и многими другими, которые сравнивают текстовые файлы, и каталоги с вложенными каталогами, их содержащие.
И в тоже время стыдливо умалчивают о побайтовом сравнении, т.е. бинарников.

Да, есть некоторые утилиты, которые умеют сравнивать побайтово, например, классическая cmp.
Но ее разработчики до сих не догадались вставить в нее рекурсию, и поэтому для сравнения каталогов она бесполезна.

Хотя есть гуишная утилита, которая умеет это делать - Meld, и которую все описатели невероятно нахваливают.
Но все они замалчивают ее жуткий недостаток - при сравнении больших, т.е. терабайтовых каталогов она позорно затыкается.
И не просто затыкается - она подвешивает систему так, что вывести ее из этого коматозного состояния является непростой задачей.

Не знаю, почему так происходит. Вероятно, получаемый лог сравнения они примитивно запихивают в ОЗУ, забывая, что еще есть своп, и если лог получается большой, оперативка переполняется и далее алес.

Вот такая проблема. Может, кто-то знает ее решение?
Может, для cmp можно написать скриптик, который научит ее работать рекурсивно, или еще какое-то другое решение.


PS. Существует несколько KDE-шных или QT-утилит для сравнения, но сорри, я их не рассматриваю, потому что моя система на gtk и захламлять систему чужеродными либами особого желания нет.
Да и вообще лучше бы без всяких там гуи, а чисто консольная утилита.

★★★★★

И в тоже время стыдливо умалчивают о побайтовом сравнении, т.е. бинарников.

Кроме мануала, где этому посвящена отдельная глава. Но так как ты у мамы особенный, который лезет вместо мануала гуглить в яндексе, то тебе её читать нельзя.

https://www.gnu.org/software/diffutils/manual/html_node/Binary.html

Может, кто-то знает ее решение?

Total Commander - Commands - Synchronize dirs...

LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 2)

сравнивать побайтово каталоги с бинарниками, чтобы что?
может тебе нужна программа xdelta?

xmikex ★★★★
()

стыдливо

странно, получается сама концепция тебе знакома, проблема уже с применением

t184256 ★★★★★
()
Ответ на: комментарий от xmikex

У rsync есть dry run

Пользовался этим ключиком по прямому его назначению - имитации работы рсинка.
А в плане сравнения он как поможет?

сравнивать побайтово каталоги с бинарниками, чтобы что?

Чтобы найти разницу между файлами, находящихся на 2-х дисках.
На 1-м диске оригинал, на 2-м его бекап.
Т.е. их содержимое априори должно быть одинаковым, но есть подозрение, что кое-что в них отличается, вот я и хочу это проверить методом сравнения.

может тебе нужна программа xdelta?

Может быть и она, только как она поможет?

Тебе утилиту в 10 строк на С написать которая это сделает? =) Или сам напишешь?

Чукча не писатель :=) Напиши, пожалуйста, если не трудно. Только на бешике, на Си использовать не буду, сорри.

chukcha ★★★★★
() автор топика
Ответ на: комментарий от pinus_nigra

man diff пробовал смотреть, обличитель?

В обнимку с ним лет 20. А что, я что в нем пропустил?
Ну да, в некоторых реализациях diff должен быть ключик --binary.

Но в Debian его увы, не завезли.
А все они, пейсатели, блин, среди которых каким-то боком даже Столман записался -

~# diff -v
diff (GNU diffutils) 3.7
Copyright © 2018 Free Software Foundation, Inc.
Лицензия GPLv3+: GNU GPL версии 3 или новее <https://gnu.org/licenses/gpl.html>
Это свободное ПО: вы можете продавать и распространять его.
Нет НИКАКИХ ГАРАНТИЙ до степени, разрешённой законом.

Авторы программы ? Поль Эггерт (Paul Eggert), Майк Гертель (Mike Haertel), Дэвид Хейз (David Hayes),
Ричард Столлман (Richard Stallman) и Лен Тауэр (Len Tower).

chukcha ★★★★★
() автор топика
Ответ на: комментарий от t184256

Да это ты сам позоришься, читать, что ли, не умеешь.
Сказано же тебе - в этой версии нет этого ключика, не завезли.
Вот сам посмотри - где тут этот ключик?

~# diff --help
Использование: diff [КЛЮЧ]? ФАЙЛЫ
Построчно сравнивает ФАЙЛЫ.

Аргументы, обязательные для длинных параметров, обязательны и для коротких.
      --normal            выводить в обычном формате diff (по умолчанию)
  -q, --brief             напечатать только различаются ли файлы
  -s, --report-identical-files
                          сообщать об одинаковых файлах
  -c, -C Н, --context[=Н] выводить по Н (по умолчанию 3) строк
                          копируемого контекста
  -u, -U Н, --unified[=Н] выводить по Н (по умолчанию 3) строк
                          объединенного контекста
  -e, --ed                выводить как сценарий ed
  -n, --rcs               выводить в формате RCS diff
  -y, --side-by-side      выводить в две колонки
  -W, --width=Н           выводить не более Н знаков в строке
                          (по умолчанию 130)
      --left-column       выводить только левую колонку общих строк
      --suppress-common-lines
                          не выводить общие строки

  -p, --show-c-function   отображать в какой функции Си находится
                          каждое изменение
  -F, --show-function-line=RE
                          отображать последнюю совпавшую с RE строку
      --label МЕТКА       использовать МЕТКУ вместо имени файла и времени
                          (может повторяться)

  -t, --expand-tabs       раскрывать при выводе символы табуляции в пробелы
  -T, --initial-tab       выравнивать строки, добавляя в начало символ табуляции
      --tabsize=Н         табуляция через каждые Н знаков (по умолчанию 8)
      --suppress-blank-empty
                          не вставлять пробел или табуляцию перед
                          выводом пустых строк
  -l, --paginate          направить вывод в pr для разбиения на страницы

  -r, --recursive         рекурсивно сравнивать подкаталоги
      --no-dereference    не переходить по символьным ссылкам
  -N, --new-file          воспринимать несуществующие файлы как пустые
      --unidirectional-new-file
                          воспринимать несуществующие первые файлы как пустые
      --ignore-file-name-case
                          игнорировать регистр в именах файлов
      --no-ignore-file-name-case
                          учитывать регистр в именах файлов
  -x, --exclude=ОБРАЗЕЦ   исключить файлы, чьи имена совпадают с ОБРАЗЦОМ
  -X, --exclude-from=ФАЙЛ исключить файлы с именами, совпадающими
                          с любым образцом из ФАЙЛА
  -S, --starting-file=ФАЙЛ
                          при сравнении каталогов начать с ФАЙЛА
      --from-file=ФАЙЛ1   сравнить ФАЙЛ1 со всеми операндами;
                          ФАЙЛ1 может быть каталогом
      --to-file=ФАЙЛ2     сравнить все операнды с ФАЙЛОМ2;
                          ФАЙЛ2 может быть каталогом

  -i, --ignore-case       игнорировать регистр в содержимом файла
  -E, --ignore-tab-expansion
                          игнорировать изменения, вызванные раскрытием табуляции
  -Z, --ignore-trailing-space
                          игнорировать пробельные символы в конце строки
  -b, --ignore-space-change
                          игнорировать изменения количества пробельных символов
  -w, --ignore-all-space  игнорировать все пробельные символы
  -B, --ignore-blank-lines
                          игнорировать изменения количества пустых строк
  -I, --ignore-matching-lines=RE
                          игнорировать изменения строк, совпадающих с RE

  -a, --text              считать все файлы текстовыми
      --strip-trailing-cr удалять из ввода завершающий возврат каретки

  -D, --ifdef=ИМЯ         выводить заплаты, использующие конструкцию ?#ifdef ИМЯ?
      --GTYPE-group-format=GFMT
                          форматировать входные группы типа GTYPE
                          в соответствии GFMT
      --line-format=LFMT  форматировать все входные строки в соответствии с LFMT
      --LTYPE-line-format=LFMT
                          форматировать входные строки типа LTYPE
                          в соответствии LFMT
  Параметры форматирования предоставляют точный контроль над конечным diff
обобщающими -D/--ifdef.
    LTYPE может быть ?old?, ?new? или ?unchanged?.
    Значение GTYPE те же или ?changed?.
    GFMT может содержать (только):
      %<  строки из ФАЙЛА1
      %>  строки из ФАЙЛА2
      %=  строки, общие для ФАЙЛА1 и ФАЙЛА2
      %[-][ШИРИНА][.[ТОЧН]]{doxX}БУКВА  формат для БУКВЫ в стиле printf
        БУКВА принимает следующие значения для новых групп, для старых строчные:
          F  номер первой строки
          L  номер последней строки
          N  число строк = L-F+1
          E  F-1
          M  L+1
      %(A=B?T:E)  если A равно B, то T, иначе E
    LFMT может содержать (только):
      %L  содержимое строки
      %l  содержимое строки, исключая все конечные символы новой строки
      %[-][ШИРИНА][.[ТОЧН]]{doxX}n  формат номера входной строки в стиле printf
    GFMT и LFMT могут содержать:
      %%  %
      %c'С'  один символ С
      %c'\OOO'  символ в восьмеричным коде OOO
      C    символ C (символы, представляющие сами себя)

  -d, --minimal           пытаться найти наименьший набор изменений
      --horizon-lines=Н   оставлять Н общих строк до и после различающихся
      --speed-large-files предполагать, что файлы большие и есть много
                          разбросанных мелких изменений
      --color[=КОГДА]     вывод в цвете; КОГДА может быть «never», «always»
                          или «auto» (по умолчанию)
      --palette=ПАЛИТРА   набор цветов при активном --color; ПАЛИТРА это
                          список свойств terminfo через двоеточие

      --help              показать эту справку и выйти
  -v, --version           показать информацию о версии и выйти

  ФАЙЛЫ это ?ФАЙЛ1 ФАЙЛ2?, ?КАТАЛОГ1 КАТАЛОГ2?, ?КАТАЛОГ ФАЙЛ??
или ?ФАЙЛ? КАТАЛОГ?.
Если задан --from-file или --to-file, то на ФАЙЛЫ нет ограничений.
Если ФАЙЛ задан как ?-?, читает стандартный ввод.
  Выходной статус равен 0, если входные файлы идентичны, 1 ? если
различаются, и 2 в случае неполадок.

Об ошибках сообщайте по адресу <bug-diffutils@gnu.org>
Домашняя страница GNU diffutils: <https://www.gnu.org/software/diffutils/>
Справка по работе с программами GNU: <https://www.gnu.org/gethelp/>
root@desktop:~# 
chukcha ★★★★★
() автор топика
Последнее исправление: chukcha (всего исправлений: 2)
Ответ на: комментарий от pinus_nigra

напечатать только различаются ли файлы

Вот именно, что «различающиеся», но где здесь сказано, что используется алгоритм сравнения именно бинарников, а не текстовых файлов?

chukcha ★★★★★
() автор топика
Ответ на: комментарий от pinus_nigra

Не, серьезно, мистер, вы меня определенно ставить в тупик своими умными вопросами ;-)

Вот я понимаю, что какой алгоритм бинарного сравнения: сравнение происходит от первого до последнего байта файлов.

А при «текстовом алгоритме» сравнения как?

chukcha ★★★★★
() автор топика

ёпта я не думаю что такая сложная программа, врач исцелись сам, программист напиши сам тот софт что несложен но нужен тебе. Зы открыл каталог сравнил файлы по размеру если не совпадает уже неча сравнивать. А если совпадает (кстати можно еще что нибудь сравнивать crc) например и потом открываешь файлы сравниваешь побайтово потом обязатеьно закрываешь перед открытием следующих дабы память освободить.

Зы что касается Meld то это вечная трабла питоньячих программ зависание gui при большой нагрузке да и без нее. Wicd тоже написана на python и тоже на gtk фризится ужасно всегда.

Зы. Только не просите меня это сделать, мне вообще не до lorа даже.

XoFfiCEr ★★☆☆
()
Ответ на: комментарий от XoFfiCEr

Это все слова, слова... Работоспособная утилита нужна, а не эпические размышления.

Кстати, о Wicd. Не знаю, как на счет фриза, она же ничего не делает ресурсоемкого, только создает и переключает конфиги.
Но вот делает она это никак. Задаю в ней вместо dhcp статику, а она ни хрена это не выполняет.

Думал, что в Debian 10.10 это уже поправят, а нифига.
Опять придется ее сносить и ставить NetworkManager.
Тоже не подарок, но работает правильно.

chukcha ★★★★★
() автор топика
Последнее исправление: chukcha (всего исправлений: 1)
Ответ на: комментарий от chukcha

алгоритм бинарного сравнения: сравнение происходит от первого до последнего байта файлов

Обычно сравнивают хеши.

Считаешь хеши рекурсивно, долго, зато потом быстро ищешь дубли.

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от chukcha

При текстовом режиме оно будет искать концы строк чтобы выдать простыню различий. diff -rq $dir1 $dir2 сделает то, что тебе надо. А ключ binary потому и убрали, что он нафиг не нужен.

pinus_nigra
()

Я в такой ситуации поступал так:

  1. Для каждого каталога прогонял что-то вроде find dir1 -type f -print0 | sort -z | xargs -0 sha256sum >> dir1.checksum

  2. Файлы с чексуммами уже сравнивал через diff.

  3. Отличающиеся файлы при необходимости сравнивал через cmp.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Это не автоматизация.

rsync -rncv dir1 dir2

^ вот автоматизация ^ .

С ключами могу наврать, проверять лень.

thesis ★★★★★
()
Последнее исправление: thesis (всего исправлений: 1)
Ответ на: комментарий от cobold

rsync-у я не особо доверяю, слишком сложная софтина. Ну и я дольше ман буду читать, чем через find напишу и дальше пойду.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Как завещал товарищ Ленин: учиться, учиться и ещё раз учиться. А так да и сложная в смысле много функционала и ман поэтому большой

cobold ★★★★★
()
Ответ на: комментарий от Legioner

А теперь натрави свой рекурсивный колхоз с sha256sum на терабайтный (см. топик) каталог, и потом мы обсудим затраты времени на чтение man rsync.

thesis ★★★★★
()
Ответ на: комментарий от thesis

Да хоть петабайтный. Этот колхоз - надёжный колхоз. Работает как советская наковальня, тут ломаться нечему.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Ну так я именно об этом. Автоматизация уровня советской наковальни.

thesis ★★★★★
()
Ответ на: комментарий от Legioner

Поддерживаю Легионера. Сам пользуюсь подобным скриптом, только для подсчета КС:

#!/bin/sh
cd "$1"
PathName=$(basename $(pwd))
cd ..
find "$PathName" -type f -print0 | xargs -0 md5sum > "$PathName".md5


На бешике, поэтому не требуется ничего компилять, как на С и прочих мега-языках.

chukcha ★★★★★
() автор топика
Ответ на: комментарий от chukcha

Да, и ты знал бы почему, если прочитал бы, что он делает, позорище.

t184256 ★★★★★
()
Ответ на: комментарий от Legioner

rsync-у я не особо доверяю, слишком сложная софтина.

Мда… Тебя красноглазый сосед-инвалид покусал? (

zemidius
()

моя система на gtk и захламлять систему чужеродными либами особого желания нет

Тяжело быть тулкитофобом, приходится терять кучу времени, зато можно сэкономить 200 мегабайт на диске

annulen ★★★★★
()
Ответ на: комментарий от chukcha

Потому что гномеры имеют свое видение дизайна и плевали с высокой колокольни на работу негномских приложений, недефолтных тем и пр. Разрабы оных же разумно закрывают жалобы пользователей со ссылками на WONTFIX баги в гноме.

t184256 ★★★★★
()

а какя цель? если просто проверить, одинаковые они или нет, то можно tar использовать, только не создавать огромный архив, а из тара перенаправить например в md5sum, проделать так с каждым из 2-х каталогов и будет понятно, отличаются они или нет, если нужно найти файл, который отличается, то можно написать скрипт, никаких сторонних программ, все уже написано до нас и есть в bash. да, кстати, diss -Naur тебе покажет все файлы, которые отличаются, даже ничего городить не надо, но возможно, tar с md5sum отработаю быстрее.

IvanR ★★★
()
Последнее исправление: IvanR (всего исправлений: 1)
Ответ на: комментарий от t184256

«Разумно закрывают» - в смысле фиксят, или закрывают, не обращая на них внимания?

Вообще-то я сам не сторонник ни гнома, ни кедов, но считаю, что в системе должно быть что-то одно из них, а не нагромождение разных библиотек, надерганных откуда попало.

IvanR: опять очередные словеса, и никакой конкретики...

chukcha ★★★★★
() автор топика
Последнее исправление: chukcha (всего исправлений: 1)
Ответ на: комментарий от t184256

и понять их более чем можно.

Т.е. гномовцы говорят, что юзайте всё, кроме Гнома, что ли?
Тогда я вообще не понимаю их :-o

chukcha ★★★★★
() автор топика
Ответ на: комментарий от chukcha

Разработчики не-гномософта говорят «юзайте все, кроме гнома». Примеры:

  • «все рисуйте CSD или GTFO»: GNOME, Alacritty
  • «тем не существует»: GNOME
  • «настройки не нужны»: GNOME
  • «приложения на чужих стеках не нужны»: не нашел сходу пример, но из CSD очевидно

Я восторгаюсь их хардкорностью и результирующей эффективностью, но блин.

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 2)
Ответ на: комментарий от t184256

У меня в гноме есть приложение на Qt (KeePassXC). Нормально работает, внешне никак не отличить от гномовского.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

есть приложение на Qt ... Нормально работает,

Чего не скажешь о LXQT :-(

Ну ведь была же отличная среда - LXDE, которую сотворил тайванец Хун Жень Йи - удобная, крохотная, шустрая, без свистоперделок!

Так нет же, какому-то долбоклюю вздумалось объединить ее с QT, и получилось LXQT - такое дерьмо, что даже политкорректных слов трудно подобрать :=((

chukcha ★★★★★
() автор топика
Ответ на: комментарий от chukcha

Работоспособная утилита нужна, а не эпические размышления.

с таким подходом вам в виндовс, тут стратегия такая, вам дан конструктор, а работоспособную утилиту вы делаете сами

IvanR ★★★
()
Ответ на: комментарий от chukcha

Про wicd есть версия что тупо забывают развести gui и тот модуль который непосредственно сканирует каналы wi-fi и все остальное что имеет отношение к работе программы в разные потоки.

А че слова то? Тебе ТЗ составить? Я вижу тема еще не решена.

XoFfiCEr ★★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.