zip állományban lévő zip állományból egyetlen fájl kinyerése köztes állomány létrehozása nélkül

Fórumok

van egy zip állományom (EnterprisejavaARchive) amiben több állomány leledzik többek között egy másik zip (JavaARchive) amiből ki szeretnék nyerni 1 db állományt úgy, hogynem szeretnék köztes állományt létrehozni.

ha tar lenne, akkor simán megoldható lenne az alábbi módon:
tar xf test.tar test/z.tar -O|tar xf - z/3 -O

ennek az analógiáját keresem Linux alatt zip- állományokra...

Köszönve előre is az ötleteket,
TamsA

Hozzászólások

Most próbáltam ki, a 7zip ki tud csomagolni STDIN-ről is, meg zipet is, szóval én így ugranék neki:


unzip p eredeti.zip benne/levo.zip | 7z x /dev/stdin 

Persze elképzelhető, hogy a 7zip is tud pipe-ba kicsomagolni, de első ránézésre nem találom.

Igazad van, most én is kipróbáltam. Nincs kedvem utánanézni a forrásban, de azt azért nem értem, hogy ha a


7z x /dev/stdin < lo.zip

forma működik (így teszteltem az első hozzászólásom előtt), akkor a


cat lo.zip | 7z l /dev/stdin

miért nem. Pontosabban miért is kellett annyit küzdeni, hogy az első forma működjön, ha egyszer a második lenne az izgalmasabb :-(

De ez az infó arra legalább jó, hogy tudjak példát mutatni a sok shell-huszárnak, hogy miért is nem kell cat | more formájú parancsokat írni :-)

Legnagyobb valószínűséggel nincs olyan eszköz, amivel ideiglenes fájl nélkül megcsinálható.

Illusztrációként tekintsük az alábbi megoldást egy fiktív myunzip nevű programmal: myunzip --stdout a.ear b.jar | myunzip /dev/stdin f.txt

ZIP archívban úgy kell egy fájlt megkeresni, hogy először a végére seekelünk, utána a fájllistához seekelünk, beolvassuk a fájllistát, majd a fájl tartalmának kezdtéhez seekelünk, és beolvassuk a fájlt. A legtöbb ZIP-kitömörítő pontosan ezt csinálja. A másik lehetőség az egész ZIP-fájl szekvenciális végigolvasása lenne (a legtöbb tar-kitömörítő .tar fájlokra ezt csinálja). Mivel csővezetékben (|) nem lehet seekelni, ezért a fenti megoldás nem működik, mert a másodok myunzip pipe-ban próbál seekelni.

A central directory valóban a file végén található, de minden file elòtt ott van a local header, amiben minden benne van, ami a kicsomagoláshoz kell. Homebrew unzip-pel simán megoldható, hogy szekvenciálisan végigolvassuk az egészet és csak a szükségeseket bontjuk ki.

Kipróbáltam nagyon sokféle megoldást, de a zip formátum miatt csak egyetlen járható út van (legalábbis SZERINTEM, több megoldást egyelőre nem találtam). Ez a fuse-zip alkalmazása.
Nyitsz egy átmeneti könyvtárat, felcsatolod a kötetet, kibontod a neked kellő fájlt, umount, könyvtár töröl:


mkdir ./tmp
fuse-zip enyem.zip ./tmp
unzip ./tmp/ebbol.zip ezt_a_fájlt
fusermount -u ./tmp
mkdir ./tmp

--
falura elmegy, városban meg úgy sem nézik...

Azt értem, hogy FS-nek látszik, de valóban nem csinál átmeneti fájlt? Mert akkor azt hiszem, valóban ez kell a kérdezőnek. Amúgy ugyanezt akkor akkor nem lehetne a KDE-féle KIO és a GNOME-féle GVFS hasonló funkcionalitásával megcsinálni? Mert mintha azok is virtuális fájlrendszerként funkcionálnak.