Crie um arquivo tar de um diretório, exceto arquivos ocultos?

17

Eu estou querendo criar um arquivo tar de um diretório específico (com seus subdiretórios, é claro). Mas quando eu faço isso, usando o comando tar, eu obtenho uma lista de arquivos que foram incluídos, por exemplo:

a calendar_final/._style.css

a calendar_final/style.css

Como você pode ver, existem duas versões do mesmo arquivo. Isso vale para todos os arquivos, e há muitos. Como faço para excluir os arquivos temporários, com o prefixo ._, do arquivo tar?

    
por Rui F Ribeiro 19.03.2011 / 19:36

4 respostas

31

Você postou em um comentário que está trabalhando em um sistema Mac OS X. Esta é uma pista importante para o propósito desses arquivos ._* .

Essas entradas do arquivo ._* são blocos de dados AppleDouble que contêm as informações extras associadas ao arquivo correspondente (o arquivo um sem o prefixo ._ ). Eles são gerados pelo específico do Mac OS X copyfile (3) família de funções. Os blobs AppleDouble armazenam dados de controle de acesso (ACLs) e atributos estendidos (comumente, os flags Finder e os “forks de recursos”, mas xattrs podem ser usados para armazenar qualquer tipo de dados).

As ferramentas de arquivo do Mac OS X fornecidas pelo sistema ( bsdtar (também linkado como tar ), gnutar e pax ) gerarão um membro% archive ._* para qualquer arquivo que tenha informações estendidas associado a isso; no modo "desarquivar", eles também decodificarão esses membros do arquivo e aplicarão as informações estendidas resultantes ao arquivo associado. Isso cria um arquivo de "fidelidade total" para uso em sistemas Mac OS X, preservando e, posteriormente, extraindo todas as informações que o sistema de arquivos HFS + pode armazenar.

As ferramentas de arquivamento correspondentes em outros sistemas não sabem dar tratamento especial a esses arquivos ._* , então eles são descompactados como arquivos normais. Como esses arquivos são inúteis em outros sistemas, eles são geralmente vistos como “arquivos inúteis”. Da mesma forma, se um sistema que não seja do Mac OS X gera um arquivo morto que inclui arquivos normais que começam com ._ , as ferramentas de desarquivamento do Mac OS X tentarão decodificar esses arquivos como informações estendidas.

Existe, no entanto, uma maneira não documentada (?) de fazer com que os arquivadores do Mac OS X fornecidos pelo sistema se comportem como em outros sistemas Unixy: a variável de ambiente COPYFILE_DISABLE. Configurar essa variável (para qualquer valor, até mesmo a cadeia vazia), evitará que os arquivadores gerem ._* membros do archive para representar qualquer informação estendida associada aos arquivos arquivados. Sua presença também impedirá que os arquivadores tentem interpretar esses membros do arquivo como informações estendidas.

COPYFILE_DISABLE=1 tar czf new.tar.gz …
COPYFILE_DISABLE=1 tar xzf unixy.tar.gz …

Você pode definir essa variável no arquivo de inicialização do seu shell se quiser trabalhar dessa forma com mais frequência do que nunca.

# disable special creation/extraction of ._* files by tar, etc. on Mac OS X
COPYFILE_DISABLE=1; export COPYFILE_DISABLE

Então, quando você precisar reativar o recurso (para preservar / restaurar as informações estendidas), você poderá "desanimá-lo" para comandos individuais:

(unset COPYFILE_DISABLE; tar czf new-osx.tar.gz …)

Os arquivadores no Mac OS X 10.4 também fazem algo semelhante, embora usem uma variável de ambiente diferente: COPY_EXTENDED_ATTRIBUTES_DISABLE

    
por 22.03.2011 / 08:22
5

Isso deve funcionar:

tar zcf calendar.tgz "a calendar_final" --exclude '.*'
    
por 19.03.2011 / 19:44
2

Frederik Deweerdt deu uma solução que funciona no GNU tar (usado no Linux, Cygwin, FreeBSD, OSX, possivelmente outros), mas não em outros sistemas como o NetBSD, OpenBSD ou Solaris.

POSIX não especifica o comando tar (porque varia muito descontroladamente entre variantes unix) e introduz o pax em vez disso. A opção -w significa produzir um archive ( -r extractos) e -x seleciona o formato de archive. A opção -s '!BRE!!' exclui todos os arquivos cujo caminho corresponde à expressão regular básica BRE.

pax -w -x ustar -s '!^.*/\..*$!!' calendar_final >calendar_final.tar
    
por 19.03.2011 / 21:07
2

A partir de bsdtar 3.0.3 - libarchive 3.0.3 (e talvez antes), há uma nova opção (específica do Mac OS X) para o comando bsdtar chamado --disable-copyfile para suprimir a criação de ._ files. Versões antigas de tar não têm a opção --disable-copyfile , mas definir a variável de ambiente COPYFILE_DISABLE=1 deve funcionar.

    
por 11.03.2012 / 18:56

Tags