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

70

Wenn ich bestimmte Dateien in OS X tariere:

tar cvf foo.tar foo

Es wird eine zusätzliche Datei ._fooim Tarball erstellt:

./._foo
foo

Das wird nur angezeigt, wenn ich es auf einem Nicht-Mac-Betriebssystem extrahiere. Existiert ._fooaber nicht auf meinem Dateisystem! Was ist los? Wie kann ich es loswerden?

Jesse Beder
quelle
Hasse das. Sieht hässlich aus, wenn ich mit 7-Zip in Archiven surfe.
Nathaniel

Antworten:

79

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 -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

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 beschrieben man copyfile
  • ls -l@Zeigt die Schlüssel und Größen der erweiterten Attribute an und ls -ledruckt 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
Jesse Beder
quelle
Ich habe GNU tar 1.15.1 standardmäßig unter MacOS X 10.5.8 (Leopard). Die neueste Version von GNU ist 1.22 (März 2009). Heruntergeladen und erstellt: Es scheint kein '--no-xattrs' zu haben, wenn es unter MacOS X erstellt wurde.
Jonathan Leffler
1
Anstatt diese Variable in das gesamte System zu exportieren, können Sie auch verwenden env COPYFILE_DISABLE tar -cf archive.tar my_folder/.
Georg Schölly,
1
@Cawas, das Problem war, dass sie im Tarball auftauchten, den ich dann plattformübergreifend verteilte, und sie haben auf einem Nicht-Apple-Betriebssystem keine Bedeutung.
Jesse Beder
1
Das stimmt Jesse, sie haben in der Tat keine Bedeutung für andere Betriebssysteme / Dateisysteme . Aber die Info ist da und wir können catoder typesehen was drin ist, zumindest. Und es ist normalerweise ein einfacher Text, der dort manuell eingegeben wurde. Ich würde es nicht zum Sichern wegwerfen, aber es kann Müll sein, wenn Sie etwas plattformübergreifend verteilen möchten, insbesondere, wenn es versehentlich da ist. Nur zu sagen, dass die Option, sie zu verlassen, ziemlich gültig ist.
Cregox
1
Zu Ihrer Information, die Exportlinie für Leopard funktioniert auch für Lion.
JJeaton
12

Ab bsdtar 3.0.3 - libarchive 3.0.3(und vielleicht schon früher) enthält der bsdtarBefehl eine neue Option, mit der --disable-copyfiledie Erstellung von ._Dateien unterdrückt werden kann.

# 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
quelle
3
Mit bsdtar 2.8.3 - libarchive 2.8.3der 10.7.5die --disable-copyfilenicht dokumentiert ist , dennoch aber zur Verfügung.
Stefan Schmidt
github.com/libarchive/libarchive/commit/… und forums.macrumors.com/showthread.php?p=20684196#post20684196 machen auf die veraltete Dokumentation von Apple aufmerksam.
Graham Perrin
1

Die ._Dateien sind Ressourcengabeln, wie in anderen Antworten erwähnt. Es gibt jedoch einen besseren Weg, um sie loszuwerden, wenn Sie tar:

export COPYFILE_DISABLE=true
tar cvf foo.tar foo

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

jtbandes
quelle
Vielen Dank! Siehe das Ende meiner obigen Antwort für diese Lösung.
Jesse Beder
dot_clean funktioniert nicht, da tar die Dateien erstellt
joedevon
0

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('.')            
Aivar
quelle
1
Nun, außer für OS X mit HFS + ...
Daniel Beck
Warum nicht? Können Sie vorschlagen, wie das Problem behoben werden kann?
Aivar
1
Diese Dateien sind in HFS + nicht vorhanden, da das Dateisystem die Metadaten intern speichern kann. Diese Dateien sind eine Problemumgehung für Dateisysteme, die dies nicht unterstützen. Wenn Sie beispielsweise Dateien von HFS + auf ein FAT-USB-Stick übertragen, entstehen sie und verschwinden, wenn Sie sie zurück übertragen.
Daniel Beck
-3

Das Punktzeichen "." Wird auf der Mac-Plattform als Anzeige für versteckte Dateien verwendet. Unter Windows ist dies das Zeichen "$". Wie auch immer, die ._foo-Datei enthält wahrscheinlich einige OS X-spezifische Informationen, und ich würde davon abraten, sie zu löschen. Auf anderen Systemen müssen Sie es ignorieren, oder jemand hier kann Ihnen ein Skript bereitstellen, das Dateien und Ordner versteckt, die mit einem "." Beginnen.

dbmikus
quelle
Es sind alle Metadaten, hauptsächlich benutzerdefinierte Symbole, die Anwendung, mit der die Datei erstellt wurde usw. Das Löschen ist sicher.
Dreamlax
Wenn Sie jedoch hauptsächlich einen Mac verwenden, würde ich empfehlen, ihn beizubehalten. Wenn Sie Windows mehr als OS X verwenden, fahren Sie fort und beenden Sie es.
Dbmikus
(@dreamlax) Zwar handelt es sich bei einem Großteil der in den erweiterten Attributen gespeicherten Daten um Metadaten, die möglicherweise sicher gelöscht werden können, dies ist jedoch nicht immer der Fall. Insbesondere wenn Dateien mit „Resource Forks“ auf etwas gespeichert werden, das nicht von HFS abgeleitet ist (FAT, UFS, tar usw.), werden diese „._ *“ -Dateien verwendet, um die Daten (neben anderen erweiterten Attributen) der zu speichern Ressourcengabeln. Während viele Dateiformate von der Verwendung von Resource Forks (in Richtung Bundles) abweichen, gibt es einige Dateien, in denen kritische Daten im Resource Fork gespeichert sind (manchmal sind die Resource Daten die einzigen Daten).
Chris Johnsen