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=".?*" ./*

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 .


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


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


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