Tar-Archiv eines Verzeichnisses erstellen, außer für versteckte Dateien?


17

Ich möchte ein tar-Archiv eines bestimmten Verzeichnisses erstellen (mit seinen Unterverzeichnissen natürlich). Aber wenn ich es mit dem Befehl tar mache, erhalte ich eine Liste der enthaltenen Dateien, zum Beispiel:

ein calendar_final /._ style.css

ein calendar_final / style.css

Wie Sie sehen, gibt es zwei Versionen derselben Datei. Dies gilt für jede Datei, und es gibt viele. Wie schließe ich die temporären Dateien mit dem Präfix ._ aus dem tar-Archiv aus?



Diese Dateien sind keine temporären Dateien, sondern stellen OS X-Dateisystem-Metadaten dar (wenn ich mich nicht irre, enthalten sie Finder-Bezeichnungen, Typ- und Ersteller-Codes, erweiterte Attribute usw.). Diese Dateien sind vor dem Erstellen des Tar unter OS X nicht vorhanden. Die möglichen Antworten hängen davon ab, ob Sie unter OS X / HFS + oder einem anderen System arbeiten.
Daniel Beck

Antworten:


33

Sie haben in einem Kommentar geschrieben, dass Sie auf einem Mac OS X-System arbeiten. Dies ist ein wichtiger Hinweis auf den Zweck dieser ._*Dateien.

Diese ._*Archiveinträge sind Teile von AppleDouble- Daten, die die zusätzlichen Informationen enthalten, die der entsprechenden Datei (der Datei ohne ._Präfix) zugeordnet sind. Sie werden von der Mac OS X-spezifischen Funktionsfamilie copyfile (3) generiert . Die AppleDouble-Blobs speichern Zugriffssteuerungsdaten (Access Control Data, ACLs) und erweiterte Attribute ( normalerweise Finder- Flags und "Resource Forks"). Xattrs können jedoch zum Speichern beliebiger Datentypen verwendet werden.

Das System gelieferte Mac OS X - Archiv Tools ( bsdtar(auch symbolische Links als tar), gnutarund pax) wird ein generieren ._*Archiv Mitglied für jede Datei , die alle erweiterten Information zugeordnet ist; Im Modus "Nicht archivieren" dekodieren sie auch diese Archivmitglieder und wenden die resultierenden erweiterten Informationen auf die zugehörige Datei an. Auf diese Weise wird ein Archiv mit vollständiger Wiedergabetreue für die Verwendung auf Mac OS X-Systemen erstellt, indem alle Informationen, die das HFS + -Dateisystem speichern kann, beibehalten und später extrahiert werden.

Die entsprechenden Archivierungstools auf anderen Systemen können diese ._*Dateien nicht speziell behandeln und werden daher als normale Dateien entpackt. Da solche Dateien auf anderen Systemen ziemlich nutzlos sind, werden sie oft als "Junk-Dateien" angesehen. Wenn ein Nicht-Mac OS X-System ein Archiv generiert, das normale Dateien enthält, die mit beginnen ._, versuchen die Mac OS X-Tools zum Aufheben der Archivierung, diese Dateien als erweiterte Informationen zu dekodieren.

Es gibt jedoch eine undokumentierte (?) Methode, mit der sich die vom System bereitgestellten Mac OS X-Archivierungsprogramme wie auf anderen Unixy-Systemen verhalten: die Umgebungsvariable COPYFILE_DISABLE. Durch Festlegen dieser Variablen (auf einen beliebigen Wert, auch auf eine leere Zeichenfolge) wird verhindert, dass die Archivierer ._*Archivmitglieder generieren , um erweiterte Informationen darzustellen, die den archivierten Dateien zugeordnet sind. Seine Anwesenheit wird auch die Archivierer daran hindern, solche Archivmitglieder als erweiterte Informationen zu interpretieren.

COPYFILE_DISABLE=1 tar czf new.tar.gz …
COPYFILE_DISABLE=1 tar xzf unixy.tar.gz …

Sie können diese Variable in der Initialisierungsdatei Ihrer Shell festlegen, wenn Sie häufiger auf diese Weise arbeiten möchten.

# disable special creation/extraction of ._* files by tar, etc. on Mac OS X
COPYFILE_DISABLE=1; export COPYFILE_DISABLE

Wenn Sie die Funktion dann erneut aktivieren müssen (um die erweiterten Informationen beizubehalten / wiederherzustellen), können Sie die Variable für einzelne Befehle "deaktivieren":

(unset COPYFILE_DISABLE; tar czf new-osx.tar.gz …)

Die Archivierer unter Mac OS X 10.4 führen ähnliche Aktionen aus, verwenden jedoch eine andere Umgebungsvariable: COPY_EXTENDED_ATTRIBUTES_DISABLE


hat jemand gesehen, dass das nicht funktioniert? Ich habe diese Lösung auf Yosemite ausprobiert und wenn ich auf einer AIX-Box entpacke, werden die PaxHeader-Verzeichnisse immer noch generiert
conorgriffin am

5

Das sollte funktionieren:

tar zcf calendar.tgz "a calendar_final" --exclude '.*'

Ich dachte, dass es funktioniert, aber als ich das Archiv entpackte, stellte ich fest, dass sie enthalten waren: /

Komisch, welche Teerversion benutzt du? tar --versiongibt GNU 1.23 hier.
Frederik Deweerdt

1
Diese Dateien sind Dateisystem-Metadaten unter OS X und existieren nicht vor der Ausführung von tar. Sie können daher auf diese Weise wahrscheinlich nicht ausgeschlossen werden. Sie sind enthalten, um das Wiederherstellen von OS X-Dateimetadaten beim Entpacken auf einem anderen Mac zu ermöglichen.
Daniel Beck

Funktioniert bei mir. Ich empfehle, um tar vzcf ...zu sehen, ob falsche Dateien enthalten waren.
Stribika

@stribika Er ist höchstwahrscheinlich auf OS X. Siehe meinen Kommentar zu der Frage. Die Dateien können nicht ausgeschlossen werden, da sie nicht außerhalb des tar-Archivs existieren.
Daniel Beck

2

Frederik Deweerdt hat eine Lösung vorgestellt, die auf GNU tar (möglicherweise unter Linux, Cygwin, FreeBSD, OSX usw.) funktioniert, jedoch nicht auf anderen Systemen wie NetBSD, OpenBSD oder Solaris.

POSIX gibt den tarBefehl nicht an (da er zwischen den Unix-Varianten zu stark variiert) und führt paxstattdessen den Befehl ein. Die Option -wbedeutet, ein Archiv ( -rAuszüge) zu erstellen und -xdas Archivformat auszuwählen. Die Option -s '!BRE!!'schließt alle Dateien aus, deren Pfad dem regulären Basisausdruck BRE entspricht.

pax -w -x ustar -s '!^.*/\..*$!!' calendar_final >calendar_final.tar

Interessant ... Ich wusste nichts über Pax.
gabe.

2

Ab bsdtar 3.0.3 - libarchive 3.0.3(und vielleicht schon früher) enthält der bsdtarBefehl eine neue (Mac OS X-spezifische) Option --disable-copyfile, um die Erstellung von ._Dateien zu unterdrücken . Ältere Versionen von tarhaben keine --disable-copyfileOption, aber das Setzen der Umgebungsvariablen COPYFILE_DISABLE=1sollte funktionieren.


Mit bsdtar 2.8.3 - libarchive 2.8.3der 10.7.5die --disable-copyfilenicht dokumentiert ist , dennoch aber zur Verfügung.
Stefan Schmidt

0

Folge diesen Schritten:

  1. Finden Sie alle ._Dateien und listen Sie sie mit auf, -lsdamit Sie alle ._Dateien sehen und schließlich löschen können.

    find /path/to/directory -type f -iname "._*.*" -ls -delete
    
  2. Erstellen Sie das Archiv .tar mit.

    tar -cvf name.tar /path/to/directory
    
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.