¿Por qué obtengo archivos como ._foo en mi tarball en OS X?

70

Cuando tar ciertos archivos en OS X:

tar cvf foo.tar foo

Produce un archivo extra ._fooen el tarball:

./._foo
foo

que solo aparece si lo extraigo en un sistema operativo que no sea Mac. ¡Pero ._foono existe en mi sistema de archivos! ¿Que esta pasando? ¿Cómo puedo deshacerme de él?

Jesse Beder
fuente
Odio eso. Se ve feo cuando estoy navegando dentro de los archivos con 7-Zip.
Nathaniel

Respuestas:

79

El tar de OS X usa el formato AppleDouble para almacenar atributos extendidos y ACL.

$ 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

El tar de OS X también sabe cómo convertir los miembros ._ a formatos nativos, pero los archivos ._ generalmente se guardan cuando los archivos se extraen en otras plataformas. Puede indicarle a tar que no incluya los metadatos configurando COPYFILE_DISABLE en algún valor:

$ COPYFILE_DISABLE=1 tar -cf 2.tar file*    
$ tar -tf 2.tar
file1
file2
file3
  • Las funciones de copyfile se describen en man copyfile
  • ls -l@muestra las claves y tamaños de atributos extendidos, ls -leimprime ACL
  • xattr -l enumera las claves y valores de atributos extendidos
  • xattr -c borra todos los atributos extendidos (-d no se puede usar solo)
  • chmod -N elimina las ACL
  • Los archivos Zip creados en OS X usan una carpeta __MACOSX para almacenar metadatos similares

Información almacenada como atributos extendidos:

  • Horquillas de recursos (las horquillas de recursos han sido atributos extendidos desde 10.4)
    • Iconos personalizados establecidos en Finder y las imágenes de los archivos Icon \ r
    • Metadatos en archivos PSD
    • Objetos almacenados en archivos scpt, estado de la ventana del Editor AppleScript, descripciones de scripts
  • Información sobre alias (los alias dejan de funcionar si se eliminan los atributos extendidos)
  • Estado de cuarentena o URL de origen de los archivos descargados de Internet
  • Comentarios destacados
  • Codificación de archivos guardados con TextEdit
  • Posición de cuidado de archivos abiertos con TextMate
  • Notas descremadas
Jesse Beder
fuente
Tengo GNU tar 1.15.1 por defecto en MacOS X 10.5.8 (Leopard). La última versión de GNU es 1.22 (marzo de 2009). Descargado y construido: no parece tener '--no-xattrs' cuando está construido en MacOS X.
Jonathan Leffler
1
En lugar de exportar esta variable a todo el sistema, también puede usarla env COPYFILE_DISABLE tar -cf archive.tar my_folder/.
Georg Schölly
1
@Cawas, el problema era que aparecieron en el tarball, que luego distribuía multiplataforma, y ​​no tienen ningún significado en un sistema operativo que no sea Apple.
Jesse Beder
1
Eso es cierto Jesse, de hecho no tienen significado para otros sistemas operativos / sistemas de archivos . Sin embargo, la información está ahí y podemos cato typepara ver lo que hay dentro, por lo menos. Y, por lo general, es un texto simple que se ingresó manualmente allí. No lo tiraría por hacer una copia de seguridad, pero puede ser basura en caso de que desee distribuir algo multiplataforma y especialmente si está allí por error. Solo decir que la opción de dejarlos es bastante válida.
cregox 01 de
1
Para su información, la línea de exportación de Leopard también funciona para Lion.
jjeaton
12

A partir de bsdtar 3.0.3 - libarchive 3.0.3(y quizás antes) hay una nueva opción para el bsdtarcomando llamado --disable-copyfilepara suprimir la creación de ._archivos.

# 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
fuente
3
Con bsdtar 2.8.3 - libarchive 2.8.3de 10.7.5la --disable-copyfileque no se documenta pero está disponible, no obstante.
Stefan Schmidt
github.com/libarchive/libarchive/commit/… y forums.macrumors.com/showthread.php?p=20684196#post20684196 llaman la atención sobre la documentación obsoleta de Apple.
Graham Perrin
1

Los ._archivos son tenedores de recursos como se menciona en otras respuestas. Sin embargo, hay una mejor manera de deshacerse de ellos al usar tar:

export COPYFILE_DISABLE=true
tar cvf foo.tar foo

También hay una dot_cleanutilidad para limpiar estos archivos (creo que generalmente se usa para almacenamiento externo).

jtbandes
fuente
¡Gracias! Vea el final de mi respuesta anterior para esa solución.
Jesse Beder el
dot_clean no funciona para esto ya que tar está creando los archivos
joedevon
0

Aquí hay un script de Python para eliminar esos archivos. Debería funcionar en cualquier sistema operativo popular.

No probado exhaustivamente, ¡use bajo su propio riesgo!

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
fuente
1
Bueno, excepto para OS X con HFS + ...
Daniel Beck
Por qué no? ¿Puedes sugerir cómo arreglarlo?
Aivar
1
Estos archivos en realidad no existen en HFS +, ya que el sistema de archivos puede almacenar los metadatos internamente. Estos archivos son una solución alternativa para los sistemas de archivos que no admiten eso, por ejemplo, cuando transfiere archivos de HFS + a una unidad flash USB FAT, aparecen y cuando los transfiere de nuevo, desaparecen.
Daniel Beck
-3

El carácter de punto, ".", Se utiliza en la plataforma Mac como un indicador de archivo oculto. En Windows, es el carácter "$". De todos modos, el archivo ._foo probablemente contiene información específica de OS X y recomendaría no eliminarlo. En otros sistemas, tendrá que ignorarlo, o alguien aquí podría proporcionarle un script que ocultará los archivos y carpetas que comienzan con un ".".

dbmikus
fuente
Es todo metadato, principalmente cosas como iconos personalizados, la aplicación que creó el archivo, etc. Es seguro eliminarlo.
dreamlax
Aún así, si usa principalmente Mac, recomendaría mantenerlo. Si usa Windows más que OS X, continúe y elimínelo.
dbmikus
(@dreamlax) Es cierto que gran parte de los datos almacenados en los atributos extendidos son metadatos que podrían eliminarse con seguridad, pero no siempre es así. En particular, cuando los archivos con "bifurcaciones de recursos" se almacenan en algo que no se deriva de HFS (FAT, UFS, tar, etc.), estos archivos '._ *' se usan para contener los datos de (entre otros atributos extendidos) horquillas de recursos. Si bien muchos formatos de archivo se están alejando del uso de bifurcaciones de recursos (hacia paquetes), hay algunos archivos donde se almacenan datos críticos en la bifurcación de recursos (a veces los datos de recursos son los únicos datos).
Chris Johnsen