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ć?
Odpowiedzi:
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:
.zip poprzez aktualizację pliku w środku) i cały plik musi zostać przepisany
więc imho po prostu użyj „ rozpakuj ” wiseley:
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.
źródło
zipmerge
scala użytkowych ZIP bez dekompresji i ponownej kompresji, na przykład.unzipping
/zipping
nieuncompress / decompress
. Tak, oczywiście można wziąć jeden wpis2.zip
(skompresowanego obiektu blob) i przenieść go,first.zip
a zatem nie ma potrzeby „kompresji”. Ale musisz wyodrębnić obiekt blob2.zip
, sprawdzić istnienie w spisie treścifirst.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, jakzipmerge
inaczej połączyć wpisy zip (kompresja na bok)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 toyou add more content [...] and the whole file has to be rewritten
- nie, zapisujesz wynik w jednym przebiegu. Dlaczego ktoś głosował na to?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
źródło
-g
dodaje pliki do istniejącego pliku zip. nie łączy ich. np .:zip -g result.zip other.zip
doda plikother.zip
do 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.To może nie być to, czego szukasz, ale bezpłatne narzędzie do budowania Ant zawiera możliwość łączenia plików Zip.
https://ant.apache.org/manual/Tasks/zip.html
źródło
https://linux.die.net/man/1/zipmerge :
źródło
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 -aoa
dowolne polecenie, które wykonasz dla każdego pliku. Użyj%f
jako 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.
źródło
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.
źródło
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.
źródło