it-swarm.com.de

Warum bekomme ich unter OS X Dateien wie ._foo in meinem Tarball?

Wenn ich bestimmte Dateien in OS X tariere:

tar cvf foo.tar foo

Es wird eine zusätzliche Datei ._foo im Tarball erstellt:

./._foo
foo

das wird nur angezeigt, wenn ich es auf einem Nicht-Mac-Betriebssystem extrahiere. Aber ._foo existiert nicht in meinem Dateisystem! Was ist los? Wie kann ich es loswerden?

66
Jesse Beder

OS X tar verwendet das AppleDouble-Format, um erweiterte Attribute und ACLs zu speichern.

$ touch file1 file2 file3
$ xattr -w key value file1
$ chmod +a 'admin allow delete' file2
$ ls [email protected] *
[email protected] 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

OS X's tar weiß auch, wie man die ._-Member zurück in native Formate konvertiert, aber die ._-Dateien bleiben normalerweise erhalten, wenn Archive auf anderen Plattformen extrahiert werden. Sie können tar anweisen, die Metadaten nicht einzuschließen, indem Sie COPYFILE_DISABLE auf einen bestimmten Wert setzen:

$ COPYFILE_DISABLE=1 tar -cf 2.tar file*    
$ tar -tf 2.tar
file1
file2
file3
  • Die Copyfile-Funktionen sind in man copyfile beschrieben.
  • ls [email protected] zeigt die Schlüssel und Größen der erweiterten Attribute an, ls -le druckt ACLs
  • xattr -l listet die Schlüssel und Werte erweiterter Attribute auf
  • xattr -c löscht alle erweiterten Attribute (-d kann nicht alleine verwendet werden)
  • chmod -N löscht ACLs
  • Unter OS X erstellte ZIP-Dateien verwenden einen __MACOSX-Ordner zum Speichern ähnlicher Metadaten

Informationen, die als erweiterte Attribute gespeichert werden:

  • Ressourcengabeln (Ressourcengabeln wurden seit 10.4 um Attribute erweitert)
    • Im Finder festgelegte benutzerdefinierte Symbole und die Bilder von Icon\r-Dateien
    • Metadaten in PSD-Dateien
    • In scpt-Dateien gespeicherte Objekte, AppleScript Editor-Fensterstatus, Beschreibungen von Skripten
  • Informationen über Aliase (Aliase funktionieren nicht mehr, wenn erweiterte Attribute entfernt werden)
  • Quarantänestatus oder Quell-URLs von Dateien, die aus dem Internet heruntergeladen wurden
  • Spotlight-Kommentare
  • Kodierung von mit TextEdit gespeicherten Dateien
  • Position der mit TextMate geöffneten Dateien
  • Anmerkungen überfliegen
75
Jesse Beder

Ab bsdtar 3.0.3 - libarchive 3.0.3 (und möglicherweise früher) gibt es eine neue Option für den Befehl bsdtar mit dem Namen --disable-copyfile, um die Erstellung von ._-Dateien zu unterdrücken.

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

Die ._-Dateien sind Ressourcengabeln, wie in anderen Antworten erwähnt. Es gibt jedoch eine bessere Möglichkeit, diese zu entfernen, wenn Sie tar verwenden:

export COPYFILE_DISABLE=true
tar cvf foo.tar foo

Es gibt auch ein dot_clean-Dienstprogramm zum Bereinigen dieser Dateien (ich denke, es wird normalerweise für die externe Speicherung verwendet).

1
jtbandes

Hier ist ein Python-Skript zum Entfernen dieser Dateien. Sollte in jedem gängigen Betriebssystem funktionieren.

Nicht gründlich getestet, Verwendung auf eigenes Risiko!

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