Jak rozpakować wieloczęściowy (łączony) plik ZIP w systemie Linux?


73

Muszę przesłać plik 400 MB na mój serwer internetowy, ale jestem ograniczony do przesyłania 200 MB. Mój host zasugerował użycie archiwum łączonego, czego nigdy nie zrobiłem w systemie Linux.

I stworzył test w swoim folderze, zapinając PDF w test.zip.001, .002i .003. Jak mogę go rozpakować? Czy najpierw muszę do nich dołączyć?

Pamiętaj, że byłbym równie szczęśliwy, używając 7z, jak i formatów ZIP. Jeśli ma to wpływ na wynik.


Może to nie być pomocne na serwerze WWW z zainstalowanym ograniczonym oprogramowaniem, ale nigdzie indziej nie widziałem tego rozwiązania i tego właśnie używam: API java.util.zip poradziło sobie ze wszystkimi częściami ZIP, które na niego rzuciłem , nawet w bardziej ogólnym przypadku braku części końcowych lub niekompletności ostatniej części. Nazywam to z Jython, więc ma postać skryptu, a oto kod: github.com/combatopera/unzipparts
Andrzej Cichocki

Odpowiedzi:


74

Najpierw musisz do nich dołączyć. Możesz użyć wspólnej aplikacji linux, catjak w poniższym przykładzie:

cat test.zip* > ~/test.zip

Spowoduje to złączyć wszystkich test.zip.001, test.zip.002itd plików w jeden większy, plik test.zip. Po utworzeniu tego pojedynczego pliku możesz uruchomićunzip test.zip

„Jak tworzyć, dzielić, łączyć i rozpakowywać archiwa zip w systemie Linux” może pomóc.


1
OK, podoba mi się to ... Postęp ... Ale naprawdę jestem tutaj Linux n00b. Zakładam, x*że nazwa pliku? A czy ~/hugefilejest katalog? Do czego służy symbol tyldy? Przepraszam, że pytam, co podejrzewam, to bardzo podstawowe pytania.
Tim

kiedy dzielisz pliki, powinieneś użyć przedrostka takiego jak x_ (np .: x_split1, x_split2, ...; podobnie jak sufiksy Windows file.001, file.002 ... itd.) tylda reprezentuje twój katalog domowy. ~ / ogromny_plik jest taki sam jak / home / tim / ogromny_plik. czy podzieliłeś swoje pliki? jakie są nazwy podzielonych plików?
fromnaboo

1
Chyba zobaczyć, gdzie kwestia przyjdzie, rozpiętej archiwum zostało utworzone w systemie Windows za pomocą 7zip z rozszerzeniem ZIP, więc auto tworzy jak TEST.zip.001, TEST.zip.002i TEST.zip.003co oznacza podział jest zupełnie inna. Zaczyna się wydawać, że łatwiej jest rzucić Linux na VMWare i utworzyć tutaj pliki, wtedy przynajmniej mam do czynienia tylko z 1 systemem operacyjnym. Czy możesz użyć polecenia SPLIT na DOWOLNYM typie pliku? tj. obrazy, filmy audio itp.?
Tim

tak, polecenie podziału działa na dowolnym pliku. zainstaluj p7zip z apt-get zainstaluj p7zip na debianie lub yum zainstaluj p7zip na fedorze, połącz pliki za pomocą: cat TEST.zip. *> zarchiwizuj i rozpakuj je.
fromnaboo

1
7za x archivejest prawdopodobnie lepiej, jeśli archiwum zawiera strukturę katalogów.
slm

38

Narzędzie Linux unziptak naprawdę nie obsługuje zamków wieloczęściowych. Z instrukcji :

Archiwa wieloczęściowe nie są jeszcze obsługiwane, z wyjątkiem zip. (Wszystkie części muszą być konkatenowane razem w kolejności, a następnie zip -F (dla zip 2.x) lub zip -FF(dla zip 3.x) należy wykonać w skonkatenowanym archiwum, aby go „naprawić”. Zip 3.0 i nowsze mogą się łączyć wieloczęściowe (podzielone) archiwa w połączone archiwum jednego pliku przy użyciu zip -s- inarchive -O outarchive. Zobacz stronę podręcznika zip 3, aby uzyskać więcej informacji.)

Musisz najpierw połączyć elementy, a następnie naprawić wynik. cat test.zip.*łączy wszystkie pliki wywoływane test.zip.*tam, gdzie symbol wieloznaczny *oznacza dowolną sekwencję znaków; pliki są wyliczane w kolejności leksykograficznej, która jest taka sama jak w kolejności numerycznej dzięki zerom wiodącym. >test.zipkieruje dane wyjściowe do pliku test.zip.

cat test.zip.* >test.zip
zip -FF test.zip --out test-full.zip
unzip test-full.zip

Jeśli utworzyłeś elementy przez bezpośrednie podzielenie pliku zip, w przeciwieństwie do tworzenia wieloczęściowego pliku zip za pomocą oficjalnego narzędzia Pkzip, wszystko, co musisz zrobić, to połączyć części.

cat test.zip.* >test.zip
unzip test.zip

1
drugim poleceniem powinien być zip -FF test.zip --out test-full.zip - wyświetli błąd bez polecenia --out
Alvin

3
Dla mnie to FFpodejście zadziałało, gdybym wskazał zippierwszy plik wieloczęściowy, catniepotrzebny.
Jānis Elmeris

1
Jak już wspomniano @ JānisElmeris, nie ma potrzeby łączenia archiwów przed ich użyciem zip -FF.
René,

24
7z x archive.zip.001

Automatycznie znajdzie resztę


1
To takie dziwne ... Aby to zadziałało, musisz najpierw zmienić nazwę wszystkich plików ZIP (.zXX i .zip) na .zip.xxx (.zip to ostatnia część), a następnie możesz użyć 7z x na pierwszym , który „wypakowuje” do skonkatowanego pliku zip, który można następnie ponownie rozpakować za pomocą rozpakowania, ale nie 7z ... Nie jestem do końca pewien, czy plik został poprawnie rozpakowany, ale przynajmniej tym razem rozpakowanie nie kompiluje się pod kątem błędów CRC .. ZIP jest tak niesamowicie zepsuty w Linuksie - unikaj, jeśli możesz. :(
Energiequant,

przynajmniej dla centów potrzebujemy również instrukcji, jak zainstalować 7z
stiv

20

Znalazłem odpowiedź tutaj: https://superuser.com/a/517758/10264

Ta odpowiedź jest podobna do koncepcji Gillesa , a mianowicie najpierw łączysz podzielone archiwum w normalne archiwum za pomocą split, a następnie rozpakujesz je za pomocą rozpakowania.

Różnica polega na tym, że zamiast używać -FFflagi, która nie działała dla mnie, po prostu mówisz zipowi, aby spakował podzielony plik bez podziału. To właśnie -s 0oznacza flaga.

Najpierw połącz podzielone archiwum w jedno archiwum:

zip -s 0 split-foo.zip --out unsplit-foo.zip

Następnie wyodrębnij pojedyncze archiwum za pomocą rozpakowania:

unzip unsplit-foo.zip

2
To jest poprawna odpowiedź na zip 3.x
texasbruce

0

Po prostu inny przykład. To zadziałało dla mnie w bash do podzielenia instalatora Oracle 3 GB:

echo "<installOracleDB.sh>: Splitting OracleDB installer"
zip /tmp/linuxx64_12201_database.zip --out /tmp/linuxx64_12201_oradb.zip -s 1000m
echo "<installOracleDB.sh>: Merging OracleDB installer"
zip -FF /tmp/linuxx64_12201_oradb.zip --out /tmp/linuxx64_12201_database.zip
echo "<installOracleDB.sh>: Removing temporary files OracleDB installer"
find /tmp -type f -name 'linuxx64_12201_oradb*' -exec rm {} +
echo "<installOracleDB.sh>: Unizipping OracleDB installer"
unzip /tmp/linuxx64_12201_database.zip

Wygląda to bardzo podobnie do poprzednich odpowiedzi. Czy możesz wyjaśnić, co robi i czym różni się od tego, co już zostało opublikowane? Proszę nie odpowiadać w komentarzach; edytuj swoją odpowiedź, aby była jaśniejsza i bardziej kompletna.
Scott,

Cześć Scot, szkoda, że ​​nie mogę odpowiedzieć w komentarzach, ale muszę teraz zrobić kilka drobnych punktów. Ta odpowiedź zawiera pełną listę poleceń do dzielenia, łączenia i rozpakowywania dużego pliku w systemie Unix. Podam więcej tekstu wyjaśniającego w celu wyjaśnienia mojej odpowiedzi. Dziękuję za odpowiedź.
TheHagueCoder

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.