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