Elfeledett hősök: cpio

Ha archívumot akarok létrehozni, már pötyögöm is hogy tar... Pedig nem biztos, hogy ez a legjobb választás, adott esetben van hatékonyabb fegyverünk, a cpio!

Mi is a cpio? Mondanám, hogy a tar-hoz hasonló archiváló, de pont hogy nem hasonló! Nem tudjuk neki azt mondani, hogy a KISPISTA könyvtárból csinálj nekünk egy archívumot, hanem a szabályos bemeneten kell nekünk adatot produkálnunk amivel dolgozhat! Nézzük mit mond barátunk a Kugli!

find . -print | cpio -o > archive.cpio

Értelmezzük, azt mondjuk a find-nek, hogy mindent is szeretnénk a jelenlegi könyvtárunkból, és a mindent is adjuk át a cpio-nak feldolgozásra, aki -o opcióra létrehozza az archive.cpio fájlt,  szupcsi! Őőőőő, lehet hogy mégsem olyan szupcsi, és barátunk a Kugli megsz..., akarom mondani nem adott tuti tippet.

 

 

Mi is a probléma? Hát az, hogy a find ebben a formában felolvassa magát az archív fájlt is, tehát az archívum bekerül az archívumba! Ez a példaként létrehozott üres .txt fájloknál nem gond, de több giga adatnál már szívás (csak kimondtam :) ), szóval erre figyeljünk...! Tehát helyesen:

find . ! -name "*.cpio" -print0 | cpio --null -ov > bkp1.cpio

Megmondtuk a find-nek, hogy a .cpio kiterjesztésű fájlt ne olvassa fel, a többi jöhet.

Nézzük a cpio alapvető opcióit ( a v minden esetben a szószátyár kapcsoló): -ov archívum létrehozása, -tv archívum tartalmának kilistázása, -iv arhívum kicsomagolása. A fenti példában a szemfülesek észrevehették, hogy a -print0 formulát használtuk, erre a különleges karakterek (pl. space) okozta problémák elkerülése miatt van szükség, viszont nagyon fontos, hogy a cpio tudtára hozzuk, hogy az elválasztó a NULL karakter, tehát szúrjuk oda, hogy --null, különben üres archívumot fogunk kapni!

cpio -ov > bkp1.cpio BE
cpio -tv < bkp1.cpio LISTA
cpio -iv < bkp1.cpio KI

És végre eljutottunk a kérdésig, miért jó nekünk? Mert a find-el kombinálva őrületes dolgokra leszünk képesek!

A csak a .txt kit. fájljainkat csomagoljuk:

find . -name "*.txt" -print0 | cpio --null -ov > text_files.cpio

A képek könyvtárból a .jpg és .png fájlokat csomagoljuk:

find képek -type f \( -name "*.jpg" -o -name "*.png" \) -print0 | cpio --null -ov > jpg_png.cpio

Az elmúlt 7 napban megváltozott fájlokat csomagoljuk (ugye érezzük már a potenciált):

find . -type f -mtime -7 -print0 | cpio --null -ov > files7.cpio

Az 1MB-nál nagyobb fájlokat csomagoljuk:

find . -type f -size +1M -print0 | cpio --null -ov > nagy.cpio

Talán kedvcsinálónak ennyi elég is... ;)

Nézzük, még mit tudunk kihozni a cpio-ból, például remekül lehet vele komplett könyvtárstruktúrát másolni, a jogosultságok és időbélyegek megtartásával (-pdm, told át, hozd létre a könyvtárakat, őrizd meg az attribútumokat):

find FORRÁS -print0 | cpio --null -pdm CÉL

 

 

Alapértelmezés szerint a cpio abszolút útvonalakat tárol az archívumban, ha relatív útvonalakat szeretnénk használni (ami hordozhatóbbá teszi az archívumot) a --no-absolute-filenames opció használandó:

find . -print0 | cpio --null -ov --no-absolute-filenames > relativ.cpio

A cpio bármit is képes csomagolni, ez teljesen szabályos formula:

find /dev | cpio -o > dev_masolat.cpio

Persze nem csak a find-el használhatjuk, csomagoljuk a "valamit" tartalmazó fájlokat:

grep -rl "valamit" /KÖNYVTÁR | cpio -o > valamit.cpio

 

A kicsomagoláskor használható opciók: 

Létrehozza a könyvtárakat, fontos, ha az archívumba lévő könyvtárstruktúrát változatlan formában szeretnénk visszakapni!

cpio -id < arch.cpio

Kérdés nélkül felülírja a létező fájlokat!

cpio -idu < arch.cpio

Nem próbálja meg visszaállítani a fájltulajdonosokat (hasznos, ha pl. root-ként lett csomagolva, te meg nem vagy az).

cpio -i --no-preserve-owner < arch.cpio

 

A cpio több formátumot kezel, alapértelmezett a bináris. Ha nagyobb hordozhatóságot szeretnénk, használjuk az ustar (POSIX-kompatibilis) formátumot, ha pedig nagy (2GB+) fájlokkal dolgozunk, érdemes az erre kitalált newc formátumra váltani!

cpio -ov -H ustar > arch.cpio POSIX
cpio -ov -H newc > arch.cpio 2GB+

 

Hirtelen ennyit a cpio-ról, barátunk továbbra is a man, jó kísérletezgetést!

 

Berus