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

70

Quando eu tar alguns arquivos no OS X:

tar cvf foo.tar foo

Ele produz um arquivo extra ._foono tarball:

./._foo
foo

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

Jesse Beder
fonte
Odeio isso. Parece feio quando estou navegando dentro de arquivos com o 7-Zip.
27909 Nathaniel

Respostas:

79

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 ._ em 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 configurando COPYFILE_DISABLE com algum valor:

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

Informações armazenadas como atributos estendidos:

  • Garfos de recursos (os garfos de recursos foram atributos estendidos desde 10.4)
    • Ícones personalizados definidos no Finder e as imagens dos arquivos Icon \ r
    • Metadados em arquivos PSD
    • Objetos armazenados em arquivos scpt, estado da janela do AppleScript Editor, descrições de scripts
  • Informações sobre aliases (aliases param de funcionar se atributos estendidos forem removidos)
  • Status da quarentena ou URLs de origem dos arquivos baixados da Internet
  • Comentários em destaque
  • Codificação de arquivos salvos com o TextEdit
  • Posição de cursor de arquivos abertos com o TextMate
  • Notas desnatadas
Jesse Beder
fonte
Eu tenho o GNU tar 1.15.1 por padrão no MacOS X 10.5.8 (Leopard). A versão mais recente do GNU é 1.22 (março de 2009). Baixado e compilado: parece não ter '--no-xattrs' quando compilado no MacOS X.
Jonathan Leffler
1
Em vez de exportar essa variável para todo o sistema, você também pode usar env COPYFILE_DISABLE tar -cf archive.tar my_folder/.
Georg Schölly
1
@Cawas, o problema era que eles apareceram no tarball, que eu estava distribuindo em várias plataformas, e não têm significado em um sistema operacional que não seja da Apple.
perfil completo de Jesse Beder
1
Isso é verdade, Jesse, eles realmente não têm significado para outros sistemas operacionais / sistemas de arquivos . Mas a informação está lá e podemos catou typepara ver o que está dentro, pelo menos. E geralmente é algo simples que foi inserido manualmente. Eu não jogaria fora por fazer backup, mas pode ser uma lixeira caso você queira distribuir algo entre plataformas e, especialmente, se houver por engano. Apenas dizer que a opção de deixá-los é bastante válido.
Cregox
1
Para sua informação, a linha de exportação do Leopard também funciona para o Lion.
jjeaton
12

A partir de bsdtar 3.0.3 - libarchive 3.0.3(e talvez antes), há uma nova opção no bsdtarcomando chamada --disable-copyfilepara suprimir a criação de ._arquivos.

# 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).
mdm
fonte
3
Com do não está documentada, mas está disponível, no entanto. bsdtar 2.8.3 - libarchive 2.8.310.7.5--disable-copyfile
Stefan Schmidt
github.com/libarchive/libarchive/commit/… e forums.macrumors.com/showthread.php?p=20684196#post20684196 chame a atenção para a documentação desatualizada da Apple.
Graham Perrin
1

Os ._arquivos são bifurcações de recursos, conforme mencionado em outras respostas. No entanto, há uma maneira melhor de se livrar deles ao usar tar:

export COPYFILE_DISABLE=true
tar cvf foo.tar foo

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

jtbandes
fonte
Obrigado! Veja o final da minha resposta acima para essa solução.
Jesse Beder
não dot_clean não funcionar para isso desde que tar está criando os arquivos
joedevon
0

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

Não completamente testado, use por sua conta e 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('.')            
Aivar
fonte
1
Bem, exceto no OS X com HFS + ...
Daniel Beck
Por que não? Você pode sugerir como consertar?
Aivar
1
Na verdade, esses arquivos não existem no HFS +, pois o sistema de arquivos pode armazenar os metadados internamente. Esses arquivos são uma solução alternativa para sistemas de arquivos que não suportam isso, por exemplo, quando você transfere arquivos do HFS + para um pen drive USB FAT, eles surgem e, quando você os transfere de volta, eles desaparecem.
Daniel Beck
-3

O caractere de ponto final, ".", É 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 oculte arquivos e pastas que começam com um ".".

dbmikus
fonte
São todos os metadados, principalmente itens como ícones personalizados, o aplicativo que criou o arquivo etc. É seguro excluir.
dreamlax
Ainda assim, se você usa principalmente o Mac, recomendo mantê-lo. Se você usa o Windows mais do que o OS X, vá em frente e mate-o.
Dbmikus 27/10/2009
(@dreamlax) É verdade que muitos dos dados armazenados nos atributos estendidos são metadados que podem ser seguros para excluir, mas esse nem sempre é o caso. Em particular, quando arquivos com “garfos de recursos” são armazenados em algo que não é derivado de HFS (FAT, UFS, tar, etc.), esses arquivos '._ *' são usados ​​para reter os dados (entre outros atributos estendidos) do arquivo garfos de recursos. Enquanto muitos formatos de arquivo estão se afastando do uso de bifurcações de recursos (em direção a pacotes configuráveis), existem alguns arquivos em que dados críticos são armazenados na bifurcação de recursos (às vezes os dados de recurso são os únicos).
31420 Chris Johnsen