Linux: Kniha kouzel, vanilková příchuť 2.14 (15. července 2022)
Veškerá moc příkazové řádky/příkazového řádku přehledně, pro začátečníky i pokročilé

11. Práce s archivy

Řada 2.x vanilkové příchuti Linuxu: Knihy kouzel je od 15. července 2022 do 1. března 2025 ve stavu dlouhodobé pasivní údržby; nahlášené chyby budou opravovány, ale aktivní vývoj se již věnuje jiným projektům. Máte-li zájem pokračovat v tvorbě Linuxu: Knihy kouzel pro novější verze linuxových operačních systémů, kontaktujte autora nebo rovnou vytvořte odnož.

1. Úvod

Tato kapitola uvádí univerzální nástroje pro balení a rozbalování archivů v mnoha různých formátech a specificky se věnuje nejrozšířenějším formátům .7z, .zip, .tar, .gz, .tar.gz a .squashfs.

Univerzální nástroje (např. apack a aunpack) nepracují s archivem samy; místo toho pouze podle přípony rozpoznají jeho typ a zavolají odpovídající nástroj, je-li v systému nainstalovaný. Oproti tomu příkazy pro práci s určitým typem archivu (např. 7z, tar či zip) pracují s archivem samy.

Poznámka: Použití „souborů se seznamem“ při psaní této kapitoly nebylo testováno.

GNU Tar je vyvíjen v rámci projektu GNU.

2. Definice

  • Archiv je soubor ve formátu primárně určeném k ukládání a pozdějšímu získání jednoho nebo více souborů libovolného typu spolu s metadaty, popř. i adresářovou strukturou. Většina typů archivů nabízí kompresi, některé také ochranu šifrováním a heslem, případně i další funkce. Za archivy se nepovažují soubory, které sice plní funkci archivu, ale není to jejich hlavní účel, jako např. databázové tabulky, repozitáře gitu či obrazy souborových systémů.
  • Vybalení souboru je získání obsahu souboru s metadaty či bez nich z archivu.
  • Rozbalení archivu je vybalení všech souborů a adresářů z archivu do adresáře.

3. Zaklínadla

3/1 Univerzální nástroje

@rozbalit archiv#1 (1)
aunpack [-X cílová/cesta] archiv.přípona
@vybalit soubor či adresář#2
aunpack [-X cílová/cesta] archiv.přípona cesta/v/archivu
@vytvořit nový archiv a uložit do něj soubory a adresáře#3
apack archiv.přípona cesta
@vypsat soubory a adresáře v archivu (pro člověka)#4 (2)
als archiv.přípona
@vypsat soubory a adresáře (pro skript)#5
@vybalit konkrétní soubor na standardní výstup#6
acat archiv.přípona cesta/v/archivu
@vypsat jen strukturu adresářů v archivu#7
@vytvořit nový archiv a uložit do něj soubory (vstup ve formátu find -print0)#8
zdroj | apack -0 archiv.přípona
@porovnat obsahy odpovídajících souborů ve dvou archivech#9
adiff archiv.přípona druhý-archiv.přípona

3/2 7Z

Příkaz „7z“ primárně podporuje formát .7z, ale podle manuálové stránky umí vytvořit také archivy formátů .bz2, .gz, .tar, .wim, .xz a .zip a rozbalit mnoho dalších formátů (ačkoliv na některé z nich volá externí programy).

@rozbalit archiv#1
7z x [-ocílový/adresář] archiv.přípona
@vybalit soubor či adresář (alternativy)#2 (3)
7z x [-spd] [-ocílový/adresář] archiv.přípona vzorek/cesty/v/archivu
7z x [-spd] [-ocílový/adresář] archiv.přípona @soubor-se-seznamem
@vybalit konkrétní soubor na standardní výstup#3
7z x -so [-spd] archiv.přípona cesta/v/archivu
@vytvořit archiv a uložit do něj soubory či adresáře (alternativy)#4
7z a -spd archiv.přípona cesta
7z a -spd archiv.přípona @soubor-se-seznamem
@vypsat soubory a adresáře v archivu (pro člověka)#5
7z l archiv.přípona
@přidat soubory či adresáře do archivu#6
7z a -spd archiv.přípona cesta
7z a -spd archiv.přípona @soubor-se-seznamem
@smazat soubory či adresáře z archivu (alternativy)#7
7z d [-spd] archiv.přípona cesta/v/archivu
7z d [-spd] archiv.přípona [@soubor-se-seznamem]
@vytvořit archiv, uložit do něj soubory či adresáře a ochránit heslem#8 (4)
7z a -p -spd [-mhe=on] archiv.přípona cesta
7z a -p -spd [-mhe=on] archiv.přípona @soubor-se-seznamem
@otestovat integritu archivu#9
7z t archiv.přípona

3/3 TAR

@rozbalit archiv#1
tar x[v]f archiv.tar
@vybalit soubor či adresář#2
tar x[v]f archiv.tar cesta/v/archivu
@vybalit konkrétní soubor na standardní výstup#3 (5)
tar xOf archiv.tar cesta/v/archivu
@vytvořit archiv a uložit do něj soubory a adresáře#4
tar c[v]f archiv.tar cesta
@vypsat soubory a adresáře v archivu#5
tar tf archiv.tar
@přidat soubory či adresáře do archivu#6 (6)
tar r[v]f archiv.tar cesta
@smazat soubory či adresáře z archivu#7
tar --delete --file archiv.tar cesta/v/archivu
@otestovat integritu archivu#8 (7)
tar tf archiv.tar >/dev/null

3/4 GZIP

@vybalit soubor (archiv smazat/ponechat)#1
gunzip soubor
gunzip -k soubor
@zabalit soubor (původní soubor smazat/ponechat)#2
gzip [-9] soubor
gzip -k [-9] soubor
@vybalit soubor na standardní výstup#3
zcat archiv.gz
@zabalit soubor ze standardního vstupu#4
zdroj | gzip [-9] > archiv.gz
@použití v rouře (zabalit/vybalit)#5
zdroj | gzip [-9] | cíl
zdroj | gunzip | cíl
@otestovat integritu archivu#6
gzip -t archiv.gz

3/5 TAR + GZIP

@rozbalit archiv#1
tar x[v]zf archiv.tar
@vybalit soubor či adresář#2
tar x[v]zf archiv.tar cesta/v/archivu
@vybalit soubor na standardní výstup#3
tar xOzf archiv.tar.gz cesta/v/archivu
@vytvořit nový archiv a uložit do něj soubory a adresáře#4
tar c[v]zf archiv.tar.gz cesta
@vypsat soubory a adresáře v archivu#5
tar tzf archiv.tar.gz
@přidat soubory či adresáře do archivu#6
gunzip archiv.tar.gz
tar r[v]f archiv.tar cesta
gzip [-9] archiv.tar
@smazat soubory či adresáře z archivu#7
cp archiv.tar.gz archiv.tar.gz.old
zcat archiv.tar.gz.old | tar --delete cesta/v/archivu | gzip [-9] > archiv.tar.gz
rm archiv.tar.gz.old

3/6 ZIP

@rozbalit archiv#1
unzip [-d cílový/adresář] archiv.zip
@vybalit soubor či adresář#2
unzip [-d cílový/adresář] archiv.zip vzorek/cesty
@vybalit soubor na standardní výstup#3
unzip -p archiv.zip vzorek/cesty
@vytvořit nový archiv a uložit do něj soubory a adresáře#4
zip -r archiv.zip cesta
@vytvořit nový archiv, uložit do něj soubory a adresáře a ochránit heslem#5
zip -re archiv.zip cesta
@vypsat soubory a adresáře v archivu#6
unzip -l archiv.zip
@přidat další soubory či adresáře#7
zip -r archiv.zip cesta
@přidat další soubory či adresáře a ochránit heslem#8
zip -re archiv.zip cesta
@smazat z archivu soubory a adresáře#9
zip -d archiv.zip vzorek/cesty

3/7 SquashFS

Poznámka: Archiv typu SquashFS obsahuje vždy svůj kořenový adresář (zpravidla jménem „squashfs-root“). Veškerý obsah archivu je pak v podstromu pod tímto adresářem.

@rozbalit archiv#1 (8)
unsquashfs -d cílový/adresář [-no-xattrs] [-info] archiv.squashfs
@vybalit soubor či adresář#2 (9)
unsquashfs -d cílový/adresář [-no-xattrs] [-info] archiv.squashfs cesta/v/archivu
@vybalit soubor na standardní výstup#3
@vytvořit nový archiv a uložit do něj soubory a adresáře#4
mksquashfs cesta archiv.squashfs -noappend [-info] [-keep-as-directory] [-další-volby]
@vypsat soubory a adresáře v archivu (pro člověka/pro skript)#5
unsquashfs -lln archiv.squashfs
unsquashfs -l archiv.squashfs | sed -E '0,/^$/d;/^squashfs-root$/s!$!/!;s/^squashfs-root//'
@přidat další soubory či adresáře#6
mksquashfs cesta archiv.squashfs [-info] [-keep-as-directory] [-další-volby]
@smazat z archivu soubory a adresáře#7 (10)
unsquashfs -d dočasný/adresář archiv.squashfs
rm -Rf [--] dočasný/adresář/cesta [dočasný/adresář/další/cesta]
mksquashfs dočasný/adresář archiv.squashfs -noappend
rm -Rf dočasný/adresář
@přidat do archivu při vytváření/doplňování adresář#8 (11)
Na konec příkazu mksquashfs doplňte ještě tento parametr (lze použít opakovaně):
-p "cesta/v archivu d mód vlastník skupina"
@přidat do archivu při vytváření/doplňování soubor#9 (12)
Na konec příkazu mksquashfs doplňte ještě tento parametr (lze použít opakovaně):
-p "cesta/v archivu f mód vlastník skupina generující příkaz"
@přidat do archivu při vytváření/doplňování symbolický odkaz#10 (13)
Na konec příkazu mksquashfs doplňte ještě tento parametr (lze použít opakovaně):
-p "cesta/v archivu s 777 vlastník skupina obsah-odkazu"

4. Zaklínadla: Připojení archivů do VFS

4/1 SquashFS

@připojit archiv (jako superuživatel/jako obyčejný uživatel)#1
sudo mount -t squashfs [-o volby,připojení] archiv.squashfs prázdný/adresář
squashfuse [-o volby,připojení] archiv.squashfs prázdný/adresář
@odpojit archiv (jako superuživatel/jako obyčejný uživatel)#2
sudo umount přípojný/bod
umount přípojný/bod

4/2 ZIP, TAR, TAR + GZIP

@připojit archiv zip/tar/tar.gz#1 (14)
archivemount [-o [ro,]volby,připojení] archiv.přípona cesta/k/prázdnému/adresáři
@odpojit archiv#2
umount cesta/k/adresáři

5. Instalace na Ubuntu

Nástroje tar, gzip a zip jsou již součástí minimální instalace Ubuntu. Nástroje apack, aunpack,7z a archivemount je nutno nainstalovat:

@apack, aunpack apod., 7z#1
sudo apt-get install atool p7zip-full [archivemount]
[sudo apt-get install arc arj lzip lzop march rpm unace unalz]
@pro práci s archivy SquashFS (kromě připojování) jsou třeba balíčky:#2
sudo apt-get install squashfs-tools squashfuse
@pro plnou podporu formátu RAR (vyžaduje nesvobodný balíček!)#3
sudo apt-get install rar
@pro svobodnou podporu formátu RAR (pouze vybalování a vypsání obsahu)#4
sudo apt-get install unrar-free
sudo ln -fsT /etc/alternatives/unrar /usr/local/bin/rar
@pokud se později rozhodnete přejít na nesvobodný balíček#5
sudo rm -f /usr/local/bin/rar
sudo apt-get purge unrar-free
sudo apt-get install rar

6. Ukázka

mkdir "Žluťoučký kůň"
printf %s\\n "žluťoučký kůň" "ŽLUŤOUČKÝ KŮŇ" >"Žluťoučký kůň/příšerně úpěl.txt"
apack "žluťoučký kůň příšerně úpěl.7z" "Žluťoučký kůň"
rm -R "Žluťoučký kůň"
ls -l
aunpack "žluťoučký kůň příšerně úpěl.7z"
ls -l "Žluťoučký kůň"
cat "Žluťoučký kůň/příšerně úpěl.txt"
printf %s\\n "Nový soubor" >"Žluťoučký kůň/nový.txt"
7z a -p -spd "žluťoučký kůň příšerně úpěl.7z" "Žluťoučký kůň/nový.txt"
Zadejte dvakrát po sobě stejné heslo (např. „abc“).
rm -R "Žluťoučký kůň"
aunpack "žluťoučký kůň příšerně úpěl.7z"
Zadejte vámi zvolené heslo.
ls -l "Žluťoučký kůň"

7. Tipy a zkušenosti

  • U formátů, které dobře neznáte, doporučuji omezit se jen na vytvoření archivu z adresářové struktury, jeho vypsání a kompletní rozbalení. Ostatní operace mají v různých formátech svoje specifika, která musíte znát, abyste daný archivní formát použili efektivně.
  • Heslo v archivu typu ZIP chrání jednotlivé soubory, nikoliv celý archiv. V jednom archivu mohou být jednotlivé soubory chráněny různými hesly, případně některé dostupné bez hesla.
  • TAR je asi jediný formát, který do archivu k souborům uloží opravdu všechna metadata včetně přístupových práv, rozšířených atributů, a dokonce i strukturu symbolických a pevných odkazů.
  • Při práci s velkými archivy typu TAR je třeba mít na paměti, že většina operací si vynutí sekvenční průchod celým archivem.
  • U svobodné implementace vybalování formátu RAR (unrar-free) jsem měl/a problémy s rozbalením některých archivů; pokud selže, může pomoci nesvobodný balíček.

8. Další zdroje informací

man 7z
man atool
man zip
man unzip
man mksquashfs

9. Zákulisí kapitoly

V této verzi kapitoly chybí:

  • nic

Tato kapitola záměrně nepokrývá:

  • zálohování
  • správu verzí
  • práci s obrazy souborových systémů
  • různé typy softwarových balíčků
  • konverze z jednoho archivního formátu na jiný (lze realizovat vybalením a zabalením)
1 Nezadáte-li cílový adresář parametrem „-X“, pak záleží cílový adresář na obsahu archivu: 1) Pokud archiv obsahuje pouze jeden soubor, vybalí se do aktuálního adresáře. 2) Jinak se vytvoří nový adresář se jménem odvozeným od jména archivu a vybalené soubory se uloží do něj. 3) Pokud takový adresář existuje, vybalené soubory se uloží do adresáře s názvem ve tvaru „Unpack-XXXX“, kde X jsou náhodné číslice.
2 Formát výstupu je závislý na typu archivu.
3 Volba -spd vypne intepretaci vzorků v cestách. Při zadávání cest mimo archiv je to žádoucí, protože zde vzorky obecně intepretuje už příkazový interpret a není žádoucí, aby je 7z interpretoval znovu, ale u cest v archivu je nutné je interpretovat na straně 7z, takže pokud nehodláte vybalovat soubory, které ve svých názvech obsahují otazníky, hvězdičky či hranaté závorky, je vhodnější tento parametr vynechat.
4 Tato ochrana heslem by měla být kompatibilní s programy pro práci s formátem 7z v jiných operačních systémech.
5 Zadáte-li k rozbalení víc souborů, tar je vypíše v pořadí, v jakém jsou uloženy v archivu; ne v pořadí, v jakém jste je zadal/a.
6 Pozor, pokud soubory v archivu již existují, přidají se znovu, takže skončíte s archivem, ve kterém je několik souborů identifikovaných stejnou cestou. S takovým archivem se pak obtížně pracuje.
7 Poznámka: tar implementuje jen velmi slabou kontrolu, takže neodhalí náhodné porušení archivu. Dokáže ale odhalit, že archiv byl zkrácen nebo přepsán zcela nesmyslnými daty. V takovém případě vypíše hlášení na standardní chybový výstup a vrátí návratový kód 2.
8 Poznámka: cílový adresář nesmí existovat, bude vytvořen a vybalí se do něj obsah kořenového adresáře archivu.
9 Poznámka: cílový adresář nesmí existovat, bude vytvořen. Cesty v archivu se zadávají relativně vůči kořenovému adresáři archivu a příkaz k nim pod cílovým adresářem vytvoří odpovídající adresářovou strukturu.
10 Doporučený postup je archiv vybalit, odstranit soubory a adresáře a znovu zabalit.
11 V cestě v archivu musejí být odzvláštněny zpětným lomítkem všechny bílé znaky (např. mezera či tabulátor), znaky „\“ a „"“ a možná ještě některé další. Takto vytvořenému adresáři nelze nastavit časové známky.
12 V cestě v archivu musejí být odzvláštněny zpětným lomítkem všechny bílé znaky (např. mezera či tabulátor), znaky „\“ a „"“ a možná ještě některé další. Generující příkaz je příkaz interpretu „sh“; mksquashfs v něm nevyžaduje žádné dodatečné odzvláštnění.
13 V cestě v archivu musejí být odzvláštněny zpětným lomítkem všechny bílé znaky (např. mezera či tabulátor), znaky „\“ a „"“ a možná ještě některé další. V obsahu odkazu se neodzvláštňují žádné znaky (ani případný konec řádky).
14 Poznámka: uživatel musí mít k uvedenému adresáři právo zápisu a adresář nesmí mít nastaven příznak omezení smazání. Kontrola přístupových práv uvnitř připojeného archivu se chová velmi podivně – uživatel připojivší archiv má vždy práva čtení a zápisu a právo spouštění u adresářů; u souboru má právo spouštění, pokud je nastaveno u „u“, „g“ nebo „o“. Všem ostatním uživatelům včetně superuživatele je zakázán jakýkoliv přístup. Důrazně doporučuji zadat přinejmenším volbu „ro“ nebo zakázat zápis do archivu. Do připojeného archivu sice je možné zapisovat, ale není to efektivní.
Líbí se vám tento projekt a chcete, aby byl ještě lepší? Můžete mi s tím pomoci. Zmiňte se o něm technicky zdatným přátelům, opravte překlepy a nahlašte nefunkční zaklínadla, aby mohla být opravena; poskytněte mi zpětnou vazbu nebo se zapojte do vývoje nových kapitol. Další informace na GitHubu v dokumentu Jak se zapojit.
[BY-SA]

Veškerý obsah této stránky (text, obrázky, zdrojový kód) je možno upravovat a šířit pod podmínkami licence Creative Commons Attribution-ShareAlike 4.0 International. Upozorňuji, že uvedená licence vyžaduje uvedení seznamu autorů, licence a zdroje a poskytnutí stejné či kompatibilní licence k provedeným změnám, jsou-li nějaké. Příslušné údaje jsou dostupné na stránce „Přehled autorů“. Šíření obsahu bez těchto údajů nebo šíření upravené verze bez poskytnutí adekvátní licence k provedeným úpravám je pravděpodobně porušení licenčních podmínek a může být postihováno. Poskytování zdrojového kódu při šíření není touto licencí vyžadováno.

Pro nové verze, další informace, aktuální zdrojový kód a možnost se zapojit do projektu „Linux: Kniha kouzel“ navštivte jeho repozitář na GitHubu.