GNU/Linux >> Znalost Linux >  >> Linux

Vytvořit archiv Tar z adresáře, s výjimkou skrytých souborů?

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ů?
Linux
  1. Vytvořit archiv dehtu rozdělený na bloky maximální velikosti?

  2. Vytvořit cílový adresář při extrahování Tarballu?

  3. Jak vytvořit archiv zip adresáře kompatibilní s Linuxem na počítači Mac

  1. Jak tarovat soubory se seřazeným pořadím?

  2. Přidání souboru do souborů TBZ

  3. Jak vyloučit soubory z archivu TAR pomocí regulárních výrazů?

  1. 16 příkazů Tar pro kompresi a extrahování souborů v Linuxu

  2. Jak archivovat soubory a adresáře v Linuxu [část 1]

  3. Linux – Problémy s oprávněními pro sdílený adresář na serveru?