Perché ottengo file come ._foo nel mio tarball su OS X?


70

Quando eseguo il tar di alcuni file in OS X:

tar cvf foo.tar foo

Produce un file extra ._foonel tarball:

./._foo
foo

che viene visualizzato solo se l'ho estratto su un sistema operativo non Mac. Ma ._foonon esiste sul mio file system! Cosa sta succedendo? Come posso liberarmene?


Lo odio. Sembra brutto quando sto sfogliando gli archivi con 7-Zip.
Nathaniel,

Risposte:


79

Il tar di OS X utilizza il formato AppleDouble per memorizzare attributi e ACL estesi.

$ 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

Il tar di OS X sa anche come riconvertire i membri ._ in formati nativi, ma i file ._ di solito vengono conservati quando gli archivi vengono estratti su altre piattaforme. Puoi dire a tar di non includere i metadati impostando COPYFILE_DISABLE su un valore:

$ COPYFILE_DISABLE=1 tar -cf 2.tar file*    
$ tar -tf 2.tar
file1
file2
file3
  • Le funzioni del file di copia sono descritte in man copyfile
  • ls -l@mostra le chiavi e le dimensioni degli attributi estesi, ls -lestampa gli ACL
  • xattr -l elenca le chiavi e i valori degli attributi estesi
  • xattr -c cancella tutti gli attributi estesi (-d non può essere usato da solo)
  • chmod -N elimina ACL
  • I file zip creati su OS X utilizzano una cartella __MACOSX per archiviare metadati simili

Informazioni archiviate come attributi estesi:

  • Forcelle di risorse (le forcelle di risorse sono state estese dagli attributi dalla 10.4)
    • Icone personalizzate impostate nel Finder e le immagini dei file Icon
    • Metadati nei file PSD
    • Oggetti memorizzati in file scpt, stato della finestra dell'Editor AppleScript, descrizioni degli script
  • Informazioni sugli alias (gli alias smettono di funzionare se vengono rimossi gli attributi estesi)
  • Stato di quarantena o URL di origine dei file scaricati da Internet
  • Commenti in primo piano
  • Codifica dei file salvati con TextEdit
  • Posizione di cura dei file aperti con TextMate
  • Note di scrematura

Ho GNU tar 1.15.1 di default su MacOS X 10.5.8 (Leopard). L'ultima versione di GNU è la 1.22 (marzo 2009). Scaricato e costruito: non sembra avere '--no-xattrs' se costruito su MacOS X.
Jonathan Leffler

1
Invece di esportare questa variabile su tutto il sistema puoi anche usare env COPYFILE_DISABLE tar -cf archive.tar my_folder/.
Georg Schölly,

1
@Cawas, il problema era che si presentavano nel tarball, che allora distribuivo multipiattaforma, e non hanno alcun significato su un sistema operativo non Apple.
Jesse Beder

1
Questo è vero Jesse, in effetti non hanno alcun significato per altri sistemi operativi / file system . Ma le informazioni sono lì e possiamo cato typeper vedere cosa c'è dentro, almeno. E di solito è qualcosa di semplice testo che è stato inserito manualmente lì. Non lo butterei via per il backup, ma può essere spazzatura nel caso in cui si desideri distribuire qualcosa multipiattaforma e specialmente se è lì per errore. Solo dire che l'opzione di lasciarli è abbastanza valida.
Cregox,

1
Cordiali saluti, La linea di esportazione per Leopard funziona anche per Lion.
jjeaton,

12

A partire da bsdtar 3.0.3 - libarchive 3.0.3(e forse prima) c'è una nuova opzione al bsdtarcomando chiamata --disable-copyfileper sopprimere la creazione di ._file.

# 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).

3
Con bsdtar 2.8.3 - libarchive 2.8.3of 10.7.5the --disable-copyfilenon è documentato ma disponibile comunque.
Stefan Schmidt,


1

I ._file sono fork di risorse come indicato in altre risposte. Tuttavia, c'è un modo migliore per sbarazzarsi di loro quando si utilizza tar:

export COPYFILE_DISABLE=true
tar cvf foo.tar foo

C'è anche dot_cleanun'utilità per ripulire questi file (penso che sia solitamente usato per l'archiviazione esterna).


Grazie! Vedi la fine della mia risposta sopra per quella soluzione.
Jesse Beder,

dot_clean non funziona per questo poiché tar sta creando i file
joedevon,

0

Ecco uno script Python per rimuovere quei file. Dovrebbe funzionare in qualsiasi sistema operativo popolare.

Non accuratamente testato, utilizzare a proprio rischio!

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('.')            

1
Bene, tranne OS X con HFS + ...
Daniel Beck

Perchè no? Puoi suggerire come risolvere?
Aivar,

1
Questi file in realtà non esistono su HFS +, poiché il file system può archiviare i metadati internamente. Questi file sono una soluzione alternativa per i file system che non lo supportano, ad esempio quando si trasferiscono file da HFS + a una chiavetta USB FAT, vengono visualizzati e, quando vengono trasferiti, svaniscono.
Daniel Beck

-3

Il carattere punto, ".", Viene utilizzato sulla piattaforma Mac come indicatore di file nascosto. Su Windows, è il carattere "$". Ad ogni modo, il file ._foo probabilmente contiene alcune informazioni specifiche su OS X e raccomanderei di non cancellarle. Su altri sistemi dovrai ignorarlo, altrimenti qualcuno potrebbe essere in grado di fornirti uno script che nasconderà file e cartelle che iniziano con un ".".


Sono tutti i metadati, principalmente cose come icone personalizzate, l'applicazione che ha creato il file, ecc. È sicuro eliminarlo.
dreamlax,

Tuttavia, se usi principalmente Mac, ti consiglio di tenerlo. Se usi Windows più di OS X, vai avanti e uccidilo.
dbmikus,

(@dreamlax) È vero che gran parte dei dati memorizzati negli attributi estesi sono metadati che potrebbero essere sicuri da eliminare, ma non è sempre così. In particolare, quando i file con "fork di risorse" sono memorizzati su qualcosa che non è derivato da HFS (FAT, UFS, tar, ecc.) Questi file '._ *' sono usati per contenere i dati da (tra gli altri attributi estesi) il fork di risorse. Mentre molti formati di file si stanno allontanando dall'uso di fork di risorse (verso pacchetti), ci sono alcuni file in cui i dati critici sono memorizzati nel fork delle risorse (a volte i dati delle risorse sono gli unici dati).
Chris Johnsen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.