answered
2015-04-28 08:03:04 +0100
Obvykle opravuje Vojta mě, tak teď mu to vrátím :-)
Proč v souboru ahoj.tar mam všechny soubory zaarchivované 2x?
Protože při archivaci adresáře se archivuje i jeho obsah, a find
normálně najde i adresář. Takže ten příkaz můžeme (pro konkrétní adresářovou strukturu: mkdir pokus; cd pokus; touch a b c;
) přepsat jako tar rf ahoj.tar . ./a ./b ./c
a v archívu pak bude ./a
jednou jako důsledek archivace .
a jednou jako důsledek explicitního vyžádání si archivace ./a
.
Jak správně zaarchvivat všechny soubory, které find nalezne?
Musíte přesněji specifikovat podmínky, aby tar nenacházel adresáře. To je totiž primární důvod "chyby". Potom bude vaše verze s tar rf
fungovat tak, jak očekáváte.
Šlo by to i s tar cf
, pokud si vzpomenete, že find -exec
má dva různé ukončovací znaky a že znak +
by se nám pro tenhle případ hodil. Ale i tak byste musel vyřešit ty adresáře, stejně jako byste je musel vyřešit i v dalších návrzích, které vám Vojta Myslivec napsal.
Druhý tar s gzipem se tváří, že funguje krásně, ale je opravdu správně?
Záleží na tom, co rozumíte slovem "správně". Jestli se ptáte na to, že ten archív vypadá, jako když má každý soubor jen jednou a jestli to je pravda, tak není. Když si porovnáte archiv 1 a rozbalený archiv 2, tak zjistíte, že obsah mají téměř totožný, až na to, že archiv 2 má víc nul mezi jednotlivými záznamy. Odhalit, co konkrétně to znamená, je trochu složitější, ale nakonec je to jednoduché: Archiv 1 je jeden archív. Archiv 2 je několik samostatných archivů připojených za sebe. Důvod, proč v něm vidíte jen jednu kopii každého souboru, je ten, že první samostatný archív byl vytvořen pro .
a obsahuje celý obsah .
, další samostatné archivy jsou vytvořeny pro jednotlivé soubory - ale například tar tf
na Frayi ty další samostatné archivy už nevidí, po prvním samostatném archivu si řekne, "jsem na konci archivu, končím". Můžete si to snadno vyzkoušet tímto skriptem:
mkdir pokus; cd pokus; touch a b c; tar cf - . > ../test.tar; touch d; tar cf - ./d >> ../test.tar; tar tf ../test.tar
Člověk by čekal, že uvidí soubory .
, ./a
, ./b
, ./c
, ./d
, ale ne - ./d
už je v dalším samostatném archivu a vůbec se nezobrazí, přestože v archivu je, jak se můžete přesvědčit pomocí cat ../test.tar
.