Erro estranho em 'tar' sem incluir arquivos chamados .__ init__.py

3

Alguém sabe por que tar não está incluindo arquivos nomeados .__init__.py (observe o ponto)?

$ mkdir /tmp/work && cd /tmp/work
$ mkdir foo
$ touch foo/.__init__.py
$ touch foo/.namespace__init__.py
$ tar czf foo.tar.gz foo

$ mkdir e && mv foo.tar.gz e/ && cd e/
$ tar zxf foo.tar.gz
$ ls -al foo/
total 0
drwxr-xr-x  2 sridharr  wheel  102 14 Mar 17:16 .
drwxr-xr-x  3 sridharr  wheel  136 14 Mar 17:17 ..
-rw-r--r--  1 sridharr  wheel    0 14 Mar 17:16 .namespace__init__.py
$ 

$ echo ".__init__.py file is missing. WTF? This is OSX 10.6"

Atualizar : o tar parece estar ignorando arquivos que começam com ._ caracteres; por quê?

Atualização 2 : não consigo reproduzir isso no Linux.

    
por Sridhar Ratnakumar 15.03.2010 / 01:22

3 respostas

6

Encontrou a solução. Nos sistemas Apple, os arquivos que começam com ._ contêm conjunto de recursos de outro arquivo. Eles não são arquivos normais que podem ser copiados e movidos.

    
por 15.03.2010 / 01:32
6

Existem algumas variáveis de ambiente não documentadas (?) que podem ser usadas para desativar o tratamento especial de atributos estendidos e / ou forks de recursos em tar (e pax , por o que vale a pena). rsync tem a opção -E / --extended-attributes para habilitar (! ) este tratamento - mas em alguns não-Apple rsync s -E significa --executability .

No Mac OS X 10.4 (a primeira versão que criou esses membros do arquivo ._* do AppleDouble), a variável de ambiente é COPY_EXTENDED_ATTRIBUTES_DISABLE . No Leopard e no Snow Leopard, a variável é COPYFILE_DISABLE . Normalmente, as variáveis precisam ser configuradas. Qualquer valor serve (até a string vazia), mas true parece ser tradicional. Assim:

COPY_EXTENDED_ATTRIBUTES_DISABLE=true COPYFILE_DISABLE=true tar …

Definir esta variável tem os seguintes efeitos:

  • Ao criar / atualizar arquivos:
    • Impede a criação de ._* membros do arquivo ao arquivar arquivos com atributos estendidos.
    • Permite a criação de ._* membros do arquivo ao arquivar arquivos ._* reais.
  • Ao extrair arquivos:
    • Faz com que ._* membros do archive sejam extraídos como arquivos simples, em vez de restaurar os atributos estendidos para o arquivo relacionado.

Em suma, definir essas variáveis torna tar , et al. agir como se estivessem em (por exemplo) Linux.

Se você raramente precisar arquivar arquivos que tenham atributos estendidos ou forks de recursos, e talvez seja necessário arquivar ou extrair os arquivos ._* reais, convém configurar e exportar essas variáveis em um dos arquivos de inicialização do shell:

# Tell tar, pax, etc. on Mac OS X 10.4+ not to archive
# extended attributes (e.g. resource forks) to ._* archive members.
# Also allows archiving and extracting actual ._* files.
COPY_EXTENDED_ATTRIBUTES_DISABLE=true COPYFILE_DISABLE=true
export COPY_EXTENDED_ATTRIBUTES_DISABLE COPYFILE_DISABLE

Esses arquivos ._* também são usados para armazenar atributos estendidos em sistemas de arquivos que não os suportam - mais comumente as variantes do FAT. Essas variáveis não ajudarão muito quando estiver lidando com ._* arquivos em outros sistemas de arquivos, apenas arquivos.

O sistema de arquivos HFS + usado no Mac OS X é perfeitamente capaz de armazenar arquivos ._* reais, então quando você usa as variáveis para extrair os arquivos para o sistema de arquivos, os arquivos podem ser acessados corretamente de todas as formas normais. p>     

por 27.05.2010 / 09:07
1

Eu não posso replicar isso em um host Debian 5.0. Talvez haja um bug na versão do tar instalado no sistema que você está usando? Qual versão do * nix você está usando?

$ mkdir foo
$ touch foo/.namespace__init__.py
$ touch foo/.__init__.py
$ tar -czvf foo.tar.gz foo/
foo/
foo/.namespace__init__.py
foo/.__init__.py

$ # example the file
$ tar -tzvf foo.tar.gz
drwxr-xr-x cfrancy/cfrancy   0 2010-03-14 17:34 foo/
-rw-r--r-- cfrancy/cfrancy   0 2010-03-14 17:34 foo/.namespace__init__.py
-rw-r--r-- cfrancy/cfrancy   0 2010-03-14 17:34 foo/.__init__.py
    
por 15.03.2010 / 01:36

Tags