Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

posted 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?

Mě by přišlo nejlepší 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 bude fungovat tak, jak očekáváte.

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 souboru je, jak se můžete přesvědčit pomocí cat ../test.tar.

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?

Mě by přišlo nejlepší 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 bude 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 souboru je, jak se můžete přesvědčit pomocí cat ../test.tar.

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?

Mě by přišlo nejlepší 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 bude 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 souboru je, jak se můžete přesvědčit pomocí cat ../test.tar.

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 souboru archivu je, jak se můžete přesvědčit pomocí cat ../test.tar.