Як комбінувати / зливати поштові файли?


21

Протягом останніх кількох місяців я копіював декілька папок даних, щоб посилати файли щотижня. Тепер я хотів би об'єднати ці zip-файли в один поштовий файл, оскільки більшість вмісту існуючих zip-файлів - це просто різні версії одних і тих же файлів даних.

Отже, якщо файл з’являється в більш ніж одному з існуючих zip-файлів, я хотів би, щоб остання версія була в новому створеному zip-файлі. Звичайно, якщо файл відображається лише в одному існуючому zip-файлі, я також хочу його в остаточному zip-файлі.

Я намагаюся уникати розпакування їх по черзі до робочої папки, перезаписуючи дані зі старих поштових файлів з даними новіших поштових файлів, а потім перезаписуючи все у новий zip-файл.

Як я розумію, pkzip поєднав би самі поштові файли, але чи є надійний і швидкий безкоштовний метод, про який мені хтось може розповісти?


1
zipmerge для перемоги
Code Bling

Відповіді:


7

вам це не сподобається, але: розпакуйте все в робочу папку в потрібному порядку, а потім застебнути результат найефективнішим способом.

в іншому випадку ви отримаєте багато витрачених циклів процесора:

  • припустимо, що ваш результат переходить до "first.zip"
  • кожен файл із "2.zip", "3.zip" тощо повинен бути розпакований, а потім знову зафіксований у "first.zip"
  • у "2.zip" існує файл "foobar.txt", а в "3.zip" - ще один файл "foobar.txt". злиття його так, як ви хочете об'єднати, призводить до "стиснення X разів"
  • toc .zip знаходиться в кінці файлу: ви додаєте більше вмісту (до середини
    .zip, оновивши файл посередині), і весь файл повинен бути переписаний

Отже, я просто використовую " unzip " mudley:

% mkdir all
% for x in *.zip ; do unzip -d all -o -u $x ; done
% zip -r all.zip all

порядок розпакування важливий, я не знаю шаблону ваших поштових імен, але я спершу витягну найновіший zip-файл, опція '-u' для розпакування перезаписує лише файли, якщо вони новіші або створює файли, якщо ні вже там. як результат, ви будете розпаковувати лише новіші файли та копіювати результат лише один раз.


Це може бути найбільш ефективним з точки зору користувача - але це не точно. Файл таблиці в zip насправді знаходиться в кінці, але ви можете довільно записати файли в кінець будь-якого zip, а потім написати нову таблицю файлів. Останній рекорд завжди виграє. Ті, хто трохи знайомий із сценарієм чи програмуванням, могли б виконати весь цей процес, не розстежуючи або стискаючи будь-які файли, просто переміщаючи двійкові шматки навколо та оновлюючи таблицю ZIP.
кесай

Насправді, ви можете просто об'єднати всі ZIP-файли в один файл (у порядку, який ви хочете), а потім записати новий запис файлу в кінці, щоб включити лише останні версії файлів. Це має додаткову перевагу в тому, що zip як і раніше містить усі попередні версії файлів, які можна відновити, якщо необхідний
caesay

"кожен файл із" 2.zip "," 3.zip "тощо повинен бути розпакований, а потім знову зафіксований у" first.zip "", невірно. В zipmergeутиліті злиття ZIP архівів без розпакування і повторного стиснення, наприклад.
ЗахБ

Я використовував unzipping/ zippingі ні uncompress / decompress. Так, очевидно, можна взяти один запис 2.zip(стиснута крапка) і перенести його, first.zipі, таким чином, ніякого "стиснення" не повинно відбуватися. Але вам доведеться витягнути з нього крапку 2.zip, знайти існування в TOC first.zip, якщо його там замінити існуючий запис (а це означає, що ви повинні перезаписати весь файл в основному) або додати його в кінці - і після цього вам потрібно додайте ток блискавки. Я не бачу, як zipmergeможна домогтися об'єднання zip-записів по-іншому (стиснення вбік)
akira

-1 тому що є набагато ефективніші способи виконання цього завдання, і жодне з виправдань цього "найефективнішого способу" не має найменшого сенсу. every file [...] has to be unzipped and then zipped again- ні, саме це робить ваше рішення. in '2.zip' exists a file 'foobar.txt' and in '3.zip' exists another file 'foobar.txt'. merging it the way you want to merge it leads to 'compress it X times'- ні, ні. Навіщо це? you add more content [...] and the whole file has to be rewritten- ні, ви пишете вихід за один прохід. Чому хтось це схвалив?
benrg

4

Просто скористайтеся опцією -g ZIP, де ви можете додати будь-яку кількість ZIP-файлів до одного (без вилучення старих). Це зекономить ваш значний час.

Також погляньте на zipmerge


4
-gдодає файли до наявного zip. це їх не зливає. наприклад: zip -g result.zip other.zipдодасть файл other.zipу result.zip . --grow Grow (додає до) вказаний zip-архів замість створення нового. Якщо ця операція не вдалася, zip намагається відновити архів у початковому стані. Якщо відновлення не вдалося, архів може бути пошкоджений. Цей параметр ігнорується, коли немає існуючого архіву або коли принаймні один член архіву повинен бути оновлений або видалений. "
akira



1

Я думав, що ви зможете зафіксувати файли, що витягуються в тимчасовий каталог.

У цьому командному рядку є проблема. Я не міг знайти спосіб замовити розпакування архівів, тому старіший архів може замінити новий архів. Цю проблему можна подолати, використовуючи розпакувач, який має перемикач командного рядка, щоб перезаписати лише новіші. В основному я використовую 7-Zip, який не має такої опції командного рядка.

Також ця команда потрібна для всіх zip-файлів, що знаходяться в одному каталозі. Не проблема, якщо всі блискавки мають унікальні назви. Однак, команду можна змінити відповідно до вашої ситуації.

for /f %f in ('dir /b *.zip') do "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoa

Щоб змінити це, використовуйте іншу розпаковувальну програму, просто замініть "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoaбудь-яку команду, яку ви виконували б на кожному файлі. Використовуйте %fяк власник місця для імені файлу, який ви хочете розпакувати.

Я спробував шукати відшліфоване додаток, безкоштовне чи іншим способом, і не знайшов його.

Сподіваємось, це дасть вам добрий початок, і WinZip або щось подібне може вирішити проблему перезапису.

Удачі.


0

Якщо я добре пам'ятаю, pkzip була програмою командного рядка.

Існує ще версія ZIP-файлу командного рядка, яка стверджує, що сумісна з pkzip.

Він називається Info-ZIP, і повинна бути версія для вашої ОС.


Чи є у нього функціонал, про який я запитую? Я не можу знайти, де в ньому перераховано цю здатність.
CChriss

1
Набір Info-Zip робить файли сумісними з PKZip, але самі програми відрізняються і, схоже, не містять опції злиття.
КарлФ

Добре, вибачте, мені вдалося скласти та запустити Info-Zip на робочій станції Apollo під DOMAIN / OS багато років тому. Я пам’ятаю, він надав різні функції в DOS / VMS / Unix та деяких інших навіть тоді. Я гадаю, це може розвинутися далі.
pavium

0

Шукайте командний рядок winzip в мережі. У Winzip є кілька версій інструментів командного рядка, щоб відповідати будь-якій версії winzip, яку ви, можливо, встановили. У інструменті командного рядка WZZIP є опція -f "освіжити", яка буде копіювати новіші файли лише тих, що відповідають імені файлу у zip-файлі виведення підсумків.

Використовуйте WZunzip, обгорнуту в операторі FOR, як показано вище, для розпакування одного файлу в каталог, а потім WZzip -f, щоб додати ці файли до zip-файлу підсумовування підсумків. Потім цикл FOR повторюється для роботи над наступним вхідним файлом для виведення в єдиний вихідний файл підсумовування. Порядок вхідних файлів не має значення, оскільки WZzip -f додасть у вихідний файл лише тоді, коли вхідні дані новіші, ніж ті, що вже є у вихідному файлі. Також будуть додані всі файли, які відсутні у вихідному файлі. Тоді ви можете розпакувати результат у папку, а потім знову застебнути її, щоб отримати файл із результатами, що ефективно упакований. Ви навіть можете це зробити автоматично після циклу FOR в кінці пакетного файлу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.