Warum erstellt tar --exclude = ". *" Ein leeres Archiv?

7

Alles, was ich lese, besagt, dass zum Ausschließen .svnund .htaccessanderer versteckter Dateien beim Erstellen eines Teerarchivs das --exclude=".*"Muster verwendet werden soll.

Wenn ich es versuche, bekomme ich ein leeres Archiv. Wenn ich die --excludelange Option weglasse, wird alles archiviert.

Hier ist der vollständige Befehl, den ich verwende:

tar -czvf ../_migrate/archive_2012-05-07.tgz --exclude=".*" ./*

Ich habe auch diese Variante ausprobiert, ohne Unterschiede in den Ergebnissen:

tar -czvf ../_migrate/archive_2012-05-07.tgz --exclude=".?*" ./*
Tom Auger
quelle
Weil du es ausschließen willst .und alles durch es erreichbar ist ...
vonbrand

Antworten:

6

Sie scheinen GNU zu verwenden tar. Der Mustervergleich in GNU tarfunktioniert auf dem gesamten Pfad und hört nicht bei /Zeichen auf. Da Sie ./für Ihre Dateiliste verwenden, bedeutet dies, dass jede einzelne Datei übereinstimmt, ./*die auch übereinstimmt .?*. Ich würde --exclude='.[^/]*'vielleicht so etwas versuchen .

jw013
quelle
Ändern Sie meinen Befehl, um tar -czvf ../_migrate/archive_2012-05-07.tgz exclude=".*" *das Problem basierend auf Ihrer Antwort zu beheben. Ich bin überrascht, dass es einen Unterschied macht, da es in meinen Gedanken *dasselbe ist wie ./*, aber anscheinend wird das '. /' Zum tarPfad hinzugefügt und so fällt alles unter das Muster. Um ganz klar zu sein, das Ausschlussmuster war in Ordnung, es ist das Dateilistenmuster, das das Problem verursacht hat.
Tom Auger
10

Ihr Muster schließt "." Aus. Dies ist das Verzeichnis, das Sie archivieren möchten. Verwenden Sie stattdessen ".? *" Als Muster.

Kyle Jones
quelle
Ich habe das herausgefunden und versucht, das Muster ".? *" Zu verwenden, was zu den gleichen Ergebnissen führte. Aber Sie haben mich ermutigt, es noch einmal zu versuchen. Ich werde bestätigen.
Tom Auger
Ich kann bestätigen, dass --exclude = ".? *" In meinem Fall nicht anders ist als ". *".
Tom Auger
In der Tat interessant. Ich habe unter Mac OS Lion getestet. tar --version ergibt "bsdtar 2.8.3 - libarchive 2.8.3". ".? *" funktioniert mit diesem Teer.
Kyle Jones
Klingt so, als ob der GNU-Teer entweder den Mustervergleich oder die Interpretation der Dateiliste ein wenig anders behandelt als bsdtar ...
Tom Auger
3

.*wird immer mit jeder Datei übereinstimmen, die enthalten sein würde, da Sie Dateien von verwenden .(die sogar für sich selbst übereinstimmen .*).

Sie müssen nichts tun, um die von Ihnen erwähnten Dateien auszuschließen. Sie werden ohnehin nicht vom Glob abgeglichen. Der *Glob stimmt nicht mit Dateien mit Punktpräfix überein, es sei denn, Sie aktivieren diese Funktionalität manuell (durch dotgloboder das Äquivalent Ihrer Shell).

Chris Down
quelle
Sie sind nicht ganz richtig im Punktteil, obwohl *versteckte Dateien nicht übereinstimmen, es dotglobsei denn, dies ist festgelegt. Unterverzeichnisse können dennoch versteckte Dateien enthalten, die glücklich geteert werden, wenn keine Ausschlussregel verwendet wird.
Lekensteyn
Ah! Das hatte ich zwar nicht bedacht.
Chris Down