Chci vytvořit archiv tar konkrétního adresáře (samozřejmě s jeho podadresáři). Ale když to udělám pomocí příkazu tar, dostanu seznam souborů, které byly zahrnuty, například:
a calendar_final/._style.css
a calendar_final/style.css
Jak vidíte, existují dvě verze stejného souboru. To platí pro každý soubor a je jich mnoho. Jak vyloučím dočasné soubory s předponou ._ z archivu tar?
Přijatá odpověď:
V komentáři jste uvedli, že pracujete na systému Mac OS X. Toto je důležité vodítko k účelu těchto ._*
soubory.
Tyto ._*
archivní položky jsou kusy dat AppleDouble, které obsahují dodatečné informace spojené s odpovídajícím souborem (ten bez ._
předpona). Jsou generovány copyfile(3) specifickým pro Mac OS X rodina funkcí. Objekty BLOB AppleDouble ukládají data řízení přístupu (ACL) a rozšířené atributy (běžně Finder flags a „resource forks“, ale xattrs lze použít k ukládání jakéhokoli druhu dat).
Systémem dodávané archivační nástroje Mac OS X (bsdtar
(také symbolicky odkazováno jako tar
), gnutar
a pax
) vygeneruje ._*
člen archivu pro jakýkoli soubor, ke kterému jsou přidruženy rozšířené informace; v režimu „unarchive“ budou také dekódovat tyto členy archivu a aplikovat výsledné rozšířené informace na přidružený soubor. Tím se vytvoří archiv „plné věrnosti“ pro použití v systémech Mac OS X zachováním a pozdější extrakcí všech informací, které může souborový systém HFS+ uložit.
Odpovídající archivační nástroje na jiných systémech nevědí, že by těmto ._*
poskytly zvláštní zacházení soubory, takže se rozbalí jako normální soubory. Vzhledem k tomu, že takové soubory jsou v jiných systémech poměrně k ničemu, jsou často považovány za „nevyžádané soubory“. Obdobně, pokud systém jiného než Mac OS X vygeneruje archiv, který obsahuje normální soubory začínající ._
, nástroje pro unarchivaci Mac OS X se pokusí dekódovat tyto soubory jako rozšířenou informaci.
Existuje však nezdokumentovaný(?) způsob, jak zajistit, aby se systémem dodané archivátory Mac OS X chovaly jako na jiných unixy systémech:proměnná prostředí COPYFILE_DISABLE. Nastavení této proměnné (na libovolnou hodnotu, dokonce i na prázdný řetězec), zabrání archivátorům ve generování ._*
členové archivu zastupovat jakékoli rozšířené informace spojené s archivovanými soubory. Jeho přítomnost také zabrání archivátorům ve snaze interpretovat takové členy archivu jako rozšířené informace.
COPYFILE_DISABLE=1 tar czf new.tar.gz …
COPYFILE_DISABLE=1 tar xzf unixy.tar.gz …
Tuto proměnnou můžete nastavit v inicializačním souboru vašeho shellu, pokud chcete tímto způsobem pracovat častěji než ne.
# disable special creation/extraction of ._* files by tar, etc. on Mac OS X
COPYFILE_DISABLE=1; export COPYFILE_DISABLE
Když pak potřebujete funkci znovu povolit (zachovat/obnovit rozšířené informace), můžete „zrušit nastavení“ proměnné pro jednotlivé příkazy:
(unset COPYFILE_DISABLE; tar czf new-osx.tar.gz …)
Archivátory na Mac OS X 10.4 také dělají něco podobného, i když používají jinou proměnnou prostředí:COPY_EXTENDED_ATTRIBUTES_DISABLE
Související:Přesměrovat STDERR a STDOUT na různé proměnné bez dočasných souborů?