Кажется, это не было детерминированной вещью, или есть способ сделать это надежно?Есть ли безопасный способ запуска diff на два ZIP-файла?
ответ
Надежность: распаковать оба, разн.
Я понятия не имею, подходит ли этот ответ для вашего использования, но он работает.
Я стараюсь избегать открытия и расширения, и это может быть дороже. – ApplePieIsGood
К сожалению, это единственный надежный способ сделать это. – Powerlord
@Powerlord: из любопытства ответ эдди ненадежен? Или чуть позже вашего комментария? – orangepips
Если вы используете GZIP, вы можете сделать что-то вроде этого:
# diff <(zcat file1.gz) <(zcat file2.gz)
Ну, мне нужно сделать это программно, и я не работаю в среде unix (к сожалению). – ApplePieIsGood
Как решение в этом ответе не «программно» решает вашу проблему? – hop
Это замечательно знать (я никогда не знал, что вы могли бы транслировать в две программные потоки в другую программу, не создавая временных файлов.) Я был смущен и запутался в ошибках, хотя до тех пор, пока не понял, что у вас не может быть пробела между < и paren. ** –
Beyond compare не имеет никаких проблем с этим.
Интересно, расширяют ли они его за кулисами и diff? Это то, что трудно сказать с помощью приложения, что он делает. – ApplePieIsGood
Я уверен, что они расширяются за кулисами. Они должны быть в состоянии показать бок о бок diff двух файлов из архивов zip. –
Это собственность, поэтому кто знает, что она делает? –
Ну, я полагаю, что zdiff будет вам полезна.
ссылка идет на сайт под названием «Как перенаправить вывод команды в файл», пожалуйста, будьте любезны, чтобы обновить ссылку –
В общем, вы не можете избежать распаковке и затем сравнивая. Различные компрессоры приведут к различным потокам байтов DEFLATEd, которые, когда INFLATEd приведут к тому же оригинальному тексту. Вы не можете просто сравнивать данные DEFLATEd друг с другом. В некоторых случаях это будет FAIL.
Но в почтовом сценарии существует CRC32, рассчитанный и сохраненный для каждой записи. Поэтому, если вы хотите проверить файлы, вы можете просто сравнить сохраненный CRC32, связанный с каждым потоком DEFLATEd, с оговорками о свойствах уникальности хэша CRC32. Он может соответствовать вашим потребностям, чтобы сравнить FileName и CRC.
Вам понадобится ZIP-библиотека, которая читает zip-файлы и предоставляет эти объекты как свойства объекта ZipEntry. DotNetZip сделает это для приложений .NET.
Это не особенно элегантно, но вы можете использовать приложение FileMerge, которое поставляется с инструментами разработчика Mac OS X, для сравнения содержимого zip-файлов с использованием настраиваемого фильтра.
Создание сценария ~/bin/zip_filemerge_filter.bash
с содержимым:
#!/bin/bash
##
# List the size, CR-32 checksum, and file path of each file in a zip archive,
# sorted in order by file path.
##
unzip -v -l "${1}" | cut -c 1-9,59-,49-57 | sort -k3
exit $?
сделать скрипт исполняемым (chmod +x ~/bin/zip_filemerge_filter.bash
).
Откройте FileMerge, откройте «Настройки» и перейдите на вкладку «Фильтры». Добавьте элемент в список: Расширение: «zip», Filter: «~/bin/zip_filemerge_filter.bash $ (FILE)», Display: Filtered, Apply *: No. (Я также добавил фильтр для. jar и .war.)
Затем используйте FileMerge (или командную строку «opendiff» wrapper) для сравнения двух .zip-файлов.
Это не позволит вам различать содержимое файлов в zip-архивах, но позволит вам быстро увидеть, какие файлы появляются в одном только архиве и какие файлы существуют в обоих, но имеют разный контент (то есть разные размеры и/или контрольная сумма).
На самом деле gzip и bzip2 поставляются со специальными инструментами для этого.
С Gzip:
$ zdiff file1.gz file2.gz
С bzip2:
$ bzdiff file1.bz2 file2.bz2
Но имейте в виду, что для очень больших файлов, вы можете столкнуться с проблемами памяти (изначально я приехал сюда, чтобы узнать о том, как чтобы решить их, поэтому у меня пока нет ответа).
Я нашел облегчение с помощью этого простого сценария Perl: diffzips.pl
рекурсивно Diffs каждого почтового файла в оригинальной молнии, что особенно полезно для пакетов различных форматов Java: баночек, войн, и уха.
zipcmp использует более простой подход и не заносит в архивные почтовые индексы.
zipcmp сравнивает zip-архивы zip1 и zip2 и проверяет, содержат ли они одни и те же файлы, сравнивая их имена, несжатые размеры и CRC. Различия в файлах и сжатых размерах игнорируются.
Sudo APT-получить установку zipcmp
Не могли бы вы объяснить мне результат, полученный при запуске 'zipcmp'. Я получил строку ввода, например' - 2380 d0c49aea c5-пользовательский продукт-5.2.0/WSO2/runtime2/бен/самозагрузки/logging.properties'. Я знаю, что '-' указывает на relavant zip-файл, но то, что указано' 2380' и 'd0c49aea'. Спасибо –
"2380" = почтовый индекс; «d0c49aea» - md5 входа; «имя записи c5-custom-product-5.2.0/wso2/runtime2/bin/bootstrap/logging.properties». Посмотрите на md5, запись может быть того же размера, но другого контента – Wender
Я обычно используют такой подход, как @ mrabbit, но запустить 2 команды разархивируйте и дифф вывод по мере необходимости. Например, мне нужно сравнить 2 файла Java WAR.
$ sdiff --width 160 \
<(unzip -l -v my_num1.war | cut -c 1-9,59-,49-57 | sort -k3) \
<(unzip -l -v my_num2.war | cut -c 1-9,59-,49-57 | sort -k3)
В результате на выходе примерно так:
-------- ------- -------- -------
Archive: Archive:
-------- -------- ---- -------- -------- ----
48619281 130 files | 51043693 130 files
1116 060ccc56 index.jsp 1116 060ccc56 index.jsp
0 00000000 META-INF/ 0 00000000 META-INF/
155 b50f41aa META-INF/MANIFEST.MF | 155 701f1623 META-INF/MANIFEST.MF
Length CRC-32 Name Length CRC-32 Name
1179 b42096f1 version.jsp 1179 b42096f1 version.jsp
0 00000000 WEB-INF/ 0 00000000 WEB-INF/
0 00000000 WEB-INF/classes/ 0 00000000 WEB-INF/classes/
0 00000000 WEB-INF/classes/com/ 0 00000000 WEB-INF/classes/com/
...
...
питона решение для архивных файлов:
import difflib
import zipfile
def diff(filename1, filename2):
differs = False
z1 = zipfile.ZipFile(open(filename1))
z2 = zipfile.ZipFile(open(filename2))
if len(z1.infolist()) != len(z2.infolist()):
print "number of archive elements differ: {} in {} vs {} in {}".format(
len(z1.infolist()), z1.filename, len(z2.infolist()), z2.filename)
return 1
for zipentry in z1.infolist():
if zipentry.filename not in z2.namelist():
print "no file named {} found in {}".format(zipentry.filename,
z2.filename)
differs = True
else:
diff = difflib.ndiff(z1.open(zipentry.filename),
z2.open(zipentry.filename))
delta = ''.join(x[2:] for x in diff
if x.startswith('- ') or x.startswith('+ '))
if delta:
differs = True
print "content for {} differs:\n{}".format(
zipentry.filename, delta)
if not differs:
print "all files are the same"
return 0
return 1
Использование в качестве
diff(filename1, filename2)
Он сравнивает файлы линии в каждом конкретном строка в памяти и показывает изменения.
- 1. CodeIgniter: Есть ли безопасный способ запуска PHP-кода внутри CodeIgniter?
- 2. Есть ли безопасный способ загрузки java JDK?
- 3. Есть ли более безопасный способ, чем serialize()?
- 4. Есть ли способ разделить столбец на два?
- 5. Есть ли безопасный способ разрешить сторонний javascript на странице?
- 6. Есть ли безопасный способ узнать, поддерживает ли соединение JDBC?
- 7. Есть ли безопасный strcmp?
- 8. Выполнение корневых команд с PHP ... Есть ли безопасный способ?
- 9. Есть ли способ получить diff для файлов `JSON Lines`?
- 10. Есть ли безопасный способ получить абсолютное значение без знака целого числа со знаком, без запуска переполнения?
- 11. Есть ли способ редактировать экран запуска?
- 12. Есть ли способ запуска сценариев огурца параллельно
- 13. Чтение больших строк в C++ - есть ли безопасный быстрый способ?
- 14. php, есть ли безопасный способ хранения пароля в файлах cookie?
- 15. Есть ли безопасный способ использования setjmp() и longjmp() в C++?
- 16. Есть ли способ застегнуть два потока?
- 17. Есть ли более безопасный способ включить FFMpeg в коммерческих приложениях?
- 18. Есть ли способ сделать два чтения атомарными?
- 19. Есть ли встроенный способ «объединить» два параметра?
- 20. Есть ли способ показать визуальный diff от Mercurial Web Server?
- 21. Есть ли безопасный способ запланировать оповещение для приложения календаря?
- 22. Есть ли безопасный способ «перемаршрутизировать» requirejs 1.0 зависимости от модуля?
- 23. Есть ли безопасный способ дифференцировать типы SendFailedExceptions из JavaMail
- 24. iOS: Есть ли безопасный способ включения ключа API в код?
- 25. Emacs: Есть ли способ генерировать скелет ChangeLog from diff?
- 26. Есть ли способ объединить два элемента интерфейса?
- 27. Есть ли способ «разбить» два XML-элемента?
- 28. Есть ли способ синхронизировать два листа?
- 29. Есть ли способ объединить эти два метода?
- 30. PHP - Есть ли безопасный способ выполнения глубокой рекурсии?
Что вы хотите изменить? Список файлов (FileA существует в одном, но не другом). Содержимое файлов (FileB в первом zip имеет эти изменения по сравнению с FileB во втором zip-файле). Или все, что выше? Ответ eduffy может работать (в Linux), если вы не заботитесь о содержимом. – JMD
Кроме того, какая платформа? Windows, Linux, другие? – JMD
Если вам все равно, если zipped-файлы совпадают, то почему бы не сравнить хэши? – EBGreen