Я пытаюсь сэкономить место при выполнении «тупой» резервной копии, просто сбрасывая данные в текстовый файл. Мой резервный скрипт выполняется ежедневно и выглядит так:
- Создайте каталог с именем после даты резервного копирования.
- Скопируйте некоторые данные в текстовый файл
"$name"
. - Если файл является действительным, GZIP его:
gzip "$name"
. В противном случаеrm "$name"
.
Теперь я хочу добавить дополнительный шаг для удаления файла, если те же данные были также доступны накануне (и создать символическую ссылку или жесткую ссылку).
Сначала я думал об использовании md5sum "$name"
, но это не работает, потому что я также храню имя файла и дату создания.
Есть ли gzip
возможность сравнить два сжатых файла и сказать мне, равны они или нет? Если gzip
нет такой возможности, есть ли другой способ достичь моей цели?
gzip
file-comparison
Lekensteyn
источник
источник
diff <(zcat file1) <(zcat file2)
, но предложение mrethubzdiff
выглядит намного лучше.Ответы:
Вы можете использовать
zcmp
или,zdiff
как предлагает mreithub в своем комментарии (или команда Кевина, которая похожа). Они будут относительно неэффективными, поскольку они распаковывают оба файла и затем передают ихcmp
илиdiff
. Если вы просто хотите ответить «они одинаковые», вы хотитеcmp
, это будет намного быстрее.Ваш подход к работе с системой
md5sum
очень хорош, но вам нужно взять MD5 перед запускомgzip
. Затем сохраните его в файле вместе с полученным.gz
файлом. Затем вы можете легко сравнить файл перед сжатием. Если имя одинаковое,md5sum -c
сделаю это за вас.И следующая резервная копия:
Так что это не изменилось. ОТОХ, если бы это изменилось:
Если вы перейдете
--quiet
к нему, он просто даст вам код выхода. 0 для совпавших, не 0 для отличающихся.MD5 довольно быстрый, но не слишком. MD4 (
openssl md4
лучшее, что вы получаете в командной строке, я считаю) примерно в два раза быстрее (ни он, ни MD5 не безопасны, но оба они примерно так же устойчивы к столкновениям, когда никто не пытается их подорвать). SHA-1 (sha1sum
) более безопасен, но медленнее; SHA-256 (sha256sum
) безопасен, но еще медленнее. CRC32 должен быть во много раз быстрее, но короче и, следовательно, будет иметь больше случайных коллизий. Это также совершенно небезопасно.источник
zdiff
кажется пустой тратой, так как я просто хочу знать , изменился ли файл, а не что .zcmp
выглядит интересно, я попробую это.Ответ @derobert великолепен, хотя я хочу поделиться другой информацией, которую нашел.
gzip -l -v
Сжатые gzip файлы уже содержат хеш (хотя и небезопасно, см. этот пост ):
Можно комбинировать CRC и несжатый размер, чтобы быстро получить отпечатки пальцев:
CMP
Для проверки, равны ли два байта, используйте
cmp file1 file2
. Теперь в сжатом файле есть заголовок с добавлением данных и нижнего колонтитула (CRC плюс исходный размер). Описание формата GZIP показывает , что заголовок содержит время , когда файл был сжат и что имя файла является NUL-завершённой строкой , которая добавляется после заголовка 10 байт.Итак, предполагая, что имя файла является постоянным и
gzip "$name"
используется одна и та же команда ( ), можно проверить, отличаются ли два файла, используяcmp
и пропуская первые байты, включая время:Примечание : предполагается, что важны одинаковые параметры сжатия, в противном случае команда всегда будет сообщать о файле как о другом. Это происходит потому, что параметры сжатия хранятся в заголовке и могут влиять на сжатые данные.
cmp
просто смотрит на необработанные байты и не интерпретирует их как gzip.Если у вас есть имена файлов одинаковой длины, вы можете попытаться вычислить байты, которые будут пропущены после прочтения имени файла. Когда имена файлов имеют разный размер, вы можете запустить
cmp
после пропуска байтов, напримерcmp <(cut -b9- file1) <(cut -b10- file2)
.zcmp
Это определенно лучший способ, сначала он сжимает данные и начинает сравнивать байты с
cmp
(на самом деле, это то, что делается вzcmp
(zdiff
) оболочке).Одно замечание, не бойтесь следующего примечания на странице руководства:
Когда у вас достаточно новый Bash, сжатие не будет использовать временный файл, а только канал. Или, как
zdiff
говорит источник:источник
gzip -v -l
что сообщит время файла вместо MTIME, если четыре байта MTIME в заголовке равны нулю. Также обратите внимание, что если есть MTIME, обычно это немного раньше времени файла, потому что это когда начинается сжатие.Чтобы сравнить два файла gzip, только содержимое, одну команду, нет
diff
, просто сравнениеmd5sum
Вы также можете «фильтровать» для соответствующих различий,
Если в сценарии, я бы порекомендовал функцию фильтра (не проверено, просто пример),
источник
cmp
.zcat
иgrep
могут быть объединены вzgrep
.zcat
это простоgunzip -c
. Используйте правильный инструмент для правильной работы, KISS лучше, чем раздувать. В этом случае я бы потратил свое время на написание чего-то, что генерирует жесткие ссылки по мере необходимости, это веселее.