Jak łączyć / scalać pliki zip?

21

Przez ostatnie kilka miesięcy kopiowałem kilka folderów danych do plików zip w odstępach tygodniowych. Teraz chciałbym połączyć te pliki zip w jeden plik zip, ponieważ większość zawartości istniejących plików zip to po prostu różne wersje tych samych plików danych.

Więc jeśli plik pojawia się w więcej niż jednym z istniejących plików zip, chciałbym, aby najnowsza wersja była w tworzonym nowym pliku zip. Oczywiście, jeśli plik pojawia się tylko w jednym istniejącym pliku zip, chcę go również w ostatecznym pliku zip.

Staram się unikać rozpakowywania ich jeden po drugim do folderu roboczego, nadpisywania danych ze starszych plików zip danymi z nowszych plików zip, a następnie ponownego zapisywania wszystkiego w nowym pliku zip.

Z tego, co rozumiem, pkzip sam połączyłby pliki zip, ale czy istnieje niezawodna i szybka darmowa metoda, o której każdy może mi powiedzieć?

CChriss
źródło
1
zipmerge na zwycięstwo
Code Bling

Odpowiedzi:

7

nie spodoba ci się to: rozpakowanie wszystkiego w folderze roboczym we właściwej kolejności, a następnie skompresowanie wyniku jest najbardziej efektywnym sposobem.

w przeciwnym razie skończy się wiele zmarnowanych cykli procesora:

  • Załóżmy, że Twój wynik trafia do „first.zip”
  • każdy plik z „2.zip”, „3.zip” itp. należy rozpakować, a następnie ponownie skompresować do formatu „first.zip”
  • w „2.zip” istnieje plik „foobar.txt”, aw „3.zip” istnieje inny plik „foobar.txt”. scalenie w sposób, w jaki chcesz scalić, prowadzi do „skompresowania X razy”
  • toc .zip znajduje się na końcu pliku: dodajesz więcej treści (na środku
    .zip poprzez aktualizację pliku w środku) i cały plik musi zostać przepisany

więc imho po prostu użyj „ rozpakuj ” wiseley:

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

kolejność rozpakowywania jest ważna, nie znam wzoru nazw zip, ale najpierw wyodrębnię najnowszy plik zip, opcja „-u” rozpakowywania zastępuje tylko pliki, jeśli są nowsze, lub tworzy pliki, jeśli nie są już tam. w rezultacie rozpakujesz tylko najnowsze pliki i skompresujesz wynik tylko raz.

akira
źródło
Może to być najbardziej skuteczne z punktu widzenia użytkownika - ale nie jest dokładne. Tabela plików w pliku zip znajduje się w rzeczywistości na końcu, ale możesz dowolnie zapisać pliki na końcu dowolnego pliku zip, a następnie napisać nową tabelę plików. Ostatni rekord zawsze wygrywa. Osoby słabo zaznajomione ze skryptami lub programowaniem mogą wykonać cały ten proces bez rozpakowywania lub kompresowania plików, po prostu przesuwając pliki binarne i aktualizując tabelę zip.
Cezay
W rzeczywistości możesz po prostu połączyć wszystkie pliki zip w jeden plik (w żądanej kolejności), a następnie napisać nowy rekord pliku na końcu, aby uwzględnić tylko najnowsze wersje plików. Ma to tę dodatkową zaletę, że zip nadal zawiera wszystkie poprzednie wersje plików, które można odzyskać, jeśli jest to konieczne
caesay
„każdy plik z„ 2.zip ”,„ 3.zip ”itp. musi zostać rozpakowany, a następnie ponownie skompresowany do„ first.zip ”” jest nieprawidłowy. W zipmergescala użytkowych ZIP bez dekompresji i ponownej kompresji, na przykład.
ZachB
Użyłem unzipping/ zippingnie uncompress / decompress. Tak, oczywiście można wziąć jeden wpis 2.zip(skompresowanego obiektu blob) i przenieść go, first.zipa zatem nie ma potrzeby „kompresji”. Ale musisz wyodrębnić obiekt blob 2.zip, sprawdzić istnienie w spisie treści first.zip, jeśli tam albo zastąp istniejący wpis (co oznacza, że ​​musisz przepisać cały plik w zasadzie) lub dołącz go na końcu - a następnie musisz dołącz toc zip. Nie wiem, jak zipmergeinaczej połączyć wpisy zip (kompresja na bok)
akira,
-1, ponieważ istnieją znacznie bardziej wydajne sposoby wykonania tego zadania i żadne z uzasadnień dla tego, że jest to „najbardziej skuteczny sposób”, nie ma najmniejszego sensu. every file [...] has to be unzipped and then zipped again- nie, tak robi twoje rozwiązanie. 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'- nie, nie robi. Dlaczego miałoby to you add more content [...] and the whole file has to be rewritten- nie, zapisujesz wynik w jednym przebiegu. Dlaczego ktoś głosował na to?
benrg
4

Wystarczy użyć opcji -g ZIP, w której możesz dodać dowolną liczbę plików ZIP do jednego (bez wypakowywania starych). Zaoszczędzi ci to znaczny czas.

Zobacz także zipmerge

Christos
źródło
4
-gdodaje pliki do istniejącego pliku zip. nie łączy ich. np .: zip -g result.zip other.zipdoda plik other.zipdo wyniku. zip - . grow Rozwijaj (dołączaj) określone archiwum zip, zamiast tworzyć nowe. Jeśli ta operacja się nie powiedzie, zip spróbuje przywrócić archiwum do pierwotnego stanu. Jeśli przywracanie nie powiedzie się, archiwum może zostać uszkodzone. Ta opcja jest ignorowana, gdy nie ma istniejącego archiwum lub gdy co najmniej jeden członek archiwum musi zostać zaktualizowany lub usunięty.
akira
2

https://linux.die.net/man/1/zipmerge :

zipmerge scala źródłowe archiwa zip source-zipz docelowym archiwum zip target-zip. Domyślnie pliki w źródłowych archiwach zip zastępują istniejące pliki o tej samej nazwie w docelowym archiwum zip.

imz - Ivan Zakharyaschev
źródło
1

Myślałem, że możesz napisać skrypt do rozpakowywania plików w katalogu tymczasowym.

Wystąpił problem z tym wierszem poleceń. Nie mogłem znaleźć sposobu na rozpakowanie archiwów, więc starsze archiwum może zastąpić nowsze. Problem ten można rozwiązać za pomocą rozpakowania, który ma przełącznik wiersza poleceń do zastępowania tylko wtedy, gdy jest nowszy. Używam głównie 7-Zip, który nie ma takiej opcji wiersza poleceń.

To polecenie wymaga również, aby wszystkie pliki zip znajdowały się w tym samym katalogu. Nie ma problemu, jeśli wszystkie zamki mają unikalne nazwy. To powiedziawszy, polecenie można zmienić w celu dopasowania do twojej sytuacji.

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

Aby to zmienić, aby użyć innego programu do rozpakowywania, po prostu zastąp "c:\program files\7-zip\7z" x %f -oc:\testdir -r -aoadowolne polecenie, które wykonasz dla każdego pliku. Użyj %fjako symbolu zastępczego dla nazwy pliku, który chcesz rozpakować.

Próbowałem szukać dopracowanej aplikacji, darmowej lub innej i tak naprawdę jej nie znalazłem.

Mam nadzieję, że da ci to dobry początek, a WinZip lub coś podobnego może zająć się problemem nadpisywania.

Powodzenia.

Scott McClenning
źródło
0

Jeśli dobrze pamiętam, pkzip był programem wiersza poleceń.

Nadal istnieje wersja ZIP z wiersza poleceń, która twierdzi, że jest kompatybilna z pkzip.

Nazywa się Info-ZIP i powinna istnieć wersja dla twojego systemu operacyjnego.

pavium
źródło
Czy ma funkcjonalność, o którą pytam? Nie mogę znaleźć, gdzie jest wymieniona ta umiejętność.
CChriss
1
Pakiet Info-Zip sprawia, że pliki są kompatybilne z PKZip, ale same programy są inne i nie wydają się zawierać opcji scalania.
CarlF
OK, przepraszam, byłem w stanie skompilować i uruchomić Info-Zip na stacji roboczej Apollo w DOMAIN / OS wiele lat temu. Pamiętam, że nawet wtedy oferował różne funkcje w DOS / VMS / Unix i kilka innych. Podejrzewam, że mogła ewoluować dalej.
pavium
0

Poszukaj linii poleceń winzip w sieci. Winzip ma kilka wersji narzędzi wiersza poleceń, które pasują do dowolnej wersji winzip, którą mogłeś zainstalować. Narzędzie wiersza polecenia WZZIP ma opcję -f „odświeżanie”, która spowoduje spakowanie nowszych plików tylko tych, które pasują do nazwy pliku w wyjściowym pliku zip sumowania.

Użyj WZunzip zawiniętego w instrukcję FOR, jak pokazano powyżej, aby rozpakować jeden plik do katalogu, a następnie WZzip -f, aby dodać te pliki do wyjściowego pliku zip sumowania. Następnie pętla FOR powtarza się, pracując nad następnym plikiem wejściowym, aby wyprowadzić do jedynego pliku wyjściowego sumowania. Kolejność plików wejściowych nie ma znaczenia, ponieważ WZzip -f doda do pliku wyjściowego tylko wtedy, gdy dane wejściowe są nowsze niż te, które są już w pliku wyjściowym. Zostaną również dodane wszystkie pliki, które nie istnieją w pliku wyjściowym. Następnie możesz rozpakować wynik do folderu, a następnie ponownie go skompresować, aby uzyskać wydajnie spakowany plik wyników. Możesz to zrobić automatycznie po pętli FOR na końcu pliku wsadowego.

eewiz
źródło