Czy można zamienić plik w archiwum zip bez rozpakowywania, usuwania starego pliku, dodawania nowego pliku i ponownego załadowania go z powrotem?
Powodem jest to, że mam plik zip, który jest naprawdę duży, w pliku zip znajduje się jeden xml, który muszę czasami aktualizować. Rozpakowanie zamka błyskawicznego i ponowne załadowanie zajmuje dużo czasu. Więc chciałbym móc po prostu zamienić jeden plik XML w pliku zip za pomocą skryptu. Mam już to sprawdza dostępność aktualizacji w pliku XML, który mam.
Czy można więc po prostu zastąpić jeden plik XML bez rozpakowywania i ponownego rozpakowywania?
Przepraszam, że użyłbym polecenia zip do zrobienia takich rzeczy, ale problem polega na tym, że skrypt jest w rzeczywistości przeznaczony dla telefonu z systemem Android, a zip nie jest poleceniem, którego mogę użyć niestety, przepraszam, że go pominąłem. Na pewno użyłbym zip, gdybym mógł, ale mam tylko rozpakowywanie dla droida, a potem jest tar w busybox, ale tar nie robi tego, czego potrzebuję
Odpowiedzi:
Z zip (1) :
Więc po prostu użyj
zip
polecenia tak, jak zwykle tworzysz nowy plik .zip zawierający tylko ten jeden plik, z wyjątkiem tego, że określona nazwa pliku .zip będzie istniejącym archiwum.źródło
zip -r myfolder.zip myfolder
myfolder/otherfolder/myfile.txt
zip -r myfolder.zip myfolder/otherfolder/myfile.txt
Zauważyłem, że
zip
plik Linuksa jest kłopotliwy przy zastępowaniu pojedynczego pliku w zipie.jar
Narzędzie z pakietu Java Development Kit może być prostsze. Rozważ typowe zadanie aktualizacjiWEB/web.xml
w pliku JAR (który jest zwykłym plikiem ZIP):Tutaj
path/to/dir
jest ścieżka do katalogu zawierającegoWEB-INF
katalog (który z kolei zawieraweb.xml
).źródło
WEB-INF
który ma ten plik.Spróbuj wykonać następujące czynności:
Przykład:
$ zip test.zip test/test.txt updating: test/test.txt (stored 0%)
źródło
updating:
zamiast tego powinieneś zobaczyć,adding:
jeśli chcesz zaktualizować plik wewnątrz zip; w przeciwnym razie dodajesz pliki do pliku ZIP, a nie go zastępujesz.Wiem, że to stare pytanie, ale chciałem zrobić to samo. Zaktualizuj plik w archiwum zip. Żadna z powyższych odpowiedzi nie pomogła mi.
Oto co zrobiłem. Utworzono katalog tymczasowy
abc
. Kopiowanefile.zip
doabc
i wyjął plik w tym katalogu. Edytowałem plik, który chciałem edytować. Następnie będąc wabc
środku, uruchom następujące polecenie-u
przełącznik będzie szukał zmienionych / nowych plików i doda je do archiwum zip.źródło
Użyj flagi aktualizacji:
-u
Przykład:
To polecenie skompresuje i doda
myFolder
(wraz z zawartością) do plikuexisting.zip
.Użycie zaawansowane:
Flaga aktualizacji faktycznie porównuje przychodzące pliki z istniejącymi i albo doda nowe pliki, albo zaktualizuje istniejące.
Dlatego jeśli chcesz dodać / zaktualizować określony podkatalog w pliku zip, po prostu zaktualizuj źródło zgodnie z potrzebami, a następnie ponownie spakuj całe źródło z
-u
flagą. Tylko zmienione pliki zostaną spakowane.Jeśli nie masz dostępu do plików źródłowych, możesz rozpakować plik zip, zaktualizować żądane pliki, a następnie ponownie spakować je z
-u
flagą. Ponownie, tylko zmienione pliki zostaną spakowane.Przykład:
Oryginalna struktura źródła
Zaktualizowana struktura źródła
Stosowanie
źródło
Możesz użyć: zip -u plik.zip ścieżka / plik_do_aktualizacji
źródło
Istnieje również opcja -f, która odświeży plik zip. Można go użyć do aktualizacji WSZYSTKICH plików, które zostały zaktualizowane od czasu wygenerowania pliku zip (zakładając, że znajdują się w tym samym miejscu w strukturze drzewa w pliku zip).
Jeśli twój plik ma nazwę /myfiles/myzip.zip, wszystko co musisz zrobić to
źródło
Od strony struktury archiwum ZIP - możesz zaktualizować plik zip bez jego ponownego kompresowania, wystarczy pominąć wszystkie pliki, które są wcześniejsze od pliku, który chcesz zastąpić, a następnie umieścić zaktualizowany plik, a następnie resztę plików. I na koniec musisz umieścić zaktualizowaną centralną strukturę katalogów. Wątpię jednak, czy większość popularnych narzędzi pozwoliłaby Ci to zrobić.
źródło
7zip
(7za) można wykorzystać do ładnego dodawania / aktualizowania plików / katalogów:Przykład: Zastąpienie (niezależnie od daty pliku)
MANIFEST.MF
pliku w pliku JAR./source/META-INF
Katalog zawieraMANIFEST.MF
plik, który chcesz umieścić wjar
(ZIP):7za a /tmp/file.jar /source/META-INF/
Tylko aktualizacja (nie zastępuje celu, jeśli źródło jest starsze)
7za u /tmp/file.jar /source/META-INF/
źródło
tak, to możliwe.
w systemach opartych na Linuksie po prostu zainstaluj zip i możesz go wywołać w linii poleceń. spójrz na stronę podręcznika: http://linux.die.net/man/1/zip
ale z mojego osobistego doświadczenia wynika, że jeśli to możliwe, a kompresja nie jest tak ważna, działa to lepiej w przypadku zwykłych plików tar i tar.
źródło