Por que obtenho arquivos como ._foo no meu tarball no OS X?

64

Quando eu alcanço certos arquivos no OS X:

tar cvf foo.tar foo

Produz um arquivo extra ._foo no tarball:

./._foo
foo

que só aparece se eu extraí-lo em um sistema operacional não-Mac. Mas ._foo não existe no meu sistema de arquivos! O que está acontecendo? Como posso me livrar disso?

    
por Jesse Beder 27.10.2009 / 02:10

5 respostas

75

O tar do OS X usa o formato AppleDouble para armazenar atributos estendidos e ACLs.

$ touch file1 file2 file3
$ xattr -w key value file1
$ chmod +a 'admin allow delete' file2
$ ls -le@ *
-rw-r--r--@ 1 lauri  staff  0 May 25 07:09 file1
    key 5
-rw-r--r--+ 1 lauri  staff  0 May 25 07:09 file2
 0: group:admin allow delete
-rw-r--r--  1 lauri  staff  0 May 25 07:09 file3
$ tar -cf 1.tar *
$ tar -tf 1.tar
./._file1
file1
./._file2
file2
file3

O tar do OS X também sabe como converter os membros ._ para os formatos nativos, mas os arquivos ._ geralmente são mantidos quando os arquivos são extraídos em outras plataformas. Você pode dizer ao tar para não incluir os metadados definindo COPYFILE_DISABLE para algum valor:

$ COPYFILE_DISABLE=1 tar -cf 2.tar file*    
$ tar -tf 2.tar
file1
file2
file3
  • As funções do copyfile são descritas em man copyfile
  • ls -l@ mostra as chaves e tamanhos dos atributos estendidos, ls -le imprime ACLs
  • xattr -l lista as chaves e valores dos atributos estendidos
  • xattr -c limpa todos os atributos estendidos (-d não pode ser usado sozinho)
  • chmod -N exclui ACLs
  • Arquivos zip criados no OS X usam uma pasta __MACOSX para armazenar metadados semelhantes

Informações armazenadas como atributos estendidos:

  • Forquilhas de recursos (os garfos de recursos foram estendidos desde 10.4)
    • Ícones personalizados definidos no Finder e nas imagens de arquivos Icon \ r
    • Metadados em arquivos PSD
    • Objetos armazenados em arquivos scpt, estado da janela do Editor AppleScript, descrições de scripts
  • Informações sobre aliases (aliases param de funcionar se atributos estendidos forem removidos)
  • Status de quarentena ou URLs de origem dos arquivos baixados da internet
  • comentários do Spotlight
  • Codificação de arquivos salvos com o TextEdit
  • Caret posição dos arquivos abertos com o TextMate
  • Notas de exame
por 27.10.2009 / 02:12
11

A partir de bsdtar 3.0.3 - libarchive 3.0.3 (e talvez antes), há uma nova opção para o comando bsdtar chamado --disable-copyfile para suprimir a criação de ._ files.

# on Mac OS X
# /usr/bin/tar -> bsdtar
ls -l /usr/bin/tar    

# from man bsdtar
--disable-copyfile
        Mac OS X specific.  Disable the use of copyfile(3).
    
por 11.03.2012 / 18:49
1

Os arquivos ._ são garfos de recursos, como mencionado em outras respostas. No entanto, há uma maneira melhor de se livrar deles quando usar tar :

export COPYFILE_DISABLE=true
tar cvf foo.tar foo

Há também um utilitário dot_clean para limpar esses arquivos (acho que geralmente é usado para armazenamento externo).

    
por 06.11.2009 / 21:05
0

Aqui está um script python para remover esses arquivos. Deve funcionar em qualquer sistema operacional popular.

Não totalmente testado, use a seu próprio risco!

import os
import os.path

def dot_clean(folder):
    files = os.listdir(folder)
    for file in files:
        full_name = folder + "/" + file
        if os.path.isdir(full_name):
            dot_clean(full_name)
        elif file.startswith("._"):
            os.remove(full_name)

dot_clean('.')            
    
por 22.12.2011 / 21:35
-3

O caractere de período, ".", é usado na plataforma Mac como um indicador de arquivo oculto. No Windows, é o caractere "$". De qualquer forma, o arquivo ._foo provavelmente contém algumas informações específicas do OS X e eu recomendaria não excluí-lo. Em outros sistemas, você terá que ignorá-lo, ou alguém aqui poderá fornecer um script que ocultará arquivos e pastas que começam com um ".".

    
por 27.10.2009 / 02:15

Tags