Verwenden Sie gzip, um die Dateien in einem Verzeichnis zu komprimieren, mit Ausnahme von bereits vorhandenen .gz-Dateien

19

Ich habe ein Protokollverzeichnis, in dem ich einen Job zum Komprimieren mit gzip einrichten möchte . Das Problem ist, dass ich die bereits komprimierten Protokolle nicht erneut komprimieren möchte.

Ich habe versucht, mit ls | grep -v gz | gzip, aber das scheint nicht zu funktionieren.

Gibt es eine Möglichkeit, dies zu tun? Grundsätzlich möchte ich jede Datei im Verzeichnis gzipen, die nicht mit .gz endet.

jabbajac
quelle

Antworten:

26

Sie können einfach Folgendes tun:

gzip *

gzip sagt Ihnen, dass es die Dateien überspringt, die bereits eine .gz Endung haben.
Wenn diese Nachricht in die Quere kommt, können Sie Folgendes verwenden:

gzip -q *

Was Sie versucht haben, hat nicht funktioniert, da gzipdie Dateinamen der zu komprimierenden Dateien nicht von stdin gelesen wurden. Dazu müssten Sie Folgendes verwenden:

ls | grep -v gz | xargs gzip

Sie schließen Dateien mit dem Muster gznicht nur am Ende des Dateinamens aus.¹ Beachten Sie außerdem, dass das Parsen der Ausgabe lsgefährlich ist, wenn Dateinamen mit Leerzeichen, Zeilenumbrüchen usw. betroffen sind.

Eine sauberere Lösung, die nicht darauf angewiesen ist, gzipDateien mit einer .gzEndung zu überspringen , besteht darin, dass auch nicht komprimierte Dateien in Unterverzeichnissen verarbeitet werden:

find .  -type f ! -name "*.gz" -exec gzip {} \;



¹ Wie bereits erwähnt izkata: Es .gzwürde nicht funktionieren, dies alleine zu verbessern. Sie müssten grep -vF .gzoder verwenden grep -v '\.gz$'. Damit bleibt die Gefahr der Verarbeitung lsder Ausgabe bestehen

Anthon
quelle
1
"... das macht es weniger wahrscheinlich, dass es mit einem internen Teil eines Dateinamens übereinstimmt" - es ist grep, verwende $es einfach, damit es klarer wird. Und du bist dem .sowieso nicht entkommen , also werden nur Dateien ausgeschlossen, die mit gz(da sie "keine Zeichen vor gz" haben) beginnen
Izkata
1
@Izkata: Nein, einschließlich des Punkts ohne Aussparung und ohne Verankerung der Regex, wobei alle Dateien $ausgeschlossen werden ( -v), deren Namen aus drei oder mehr Zeichen bestehen, einschließlich eines beliebigen Zeichens, gefolgt von "gz", an einer beliebigen Stelle im Dateinamen. Es enthält also Dateien mit Namen, die mit "gz" beginnen.
Bis auf weiteres angehalten.
1
@DennisWilliamson Mein letzter Kommentar war nicht klar, er schließt auch Dateien aus, die gzirgendwo im Namen enthalten sind (außer am Anfang). Also ist es besser, es trotzdem zu verankern. Nachdem es nicht benutzt wurde $, hatte es den Anschein, als wüssten Sie nicht, was es .in einem regulären Ausdruck bedeutet, daher der Rest des verwirrenden Kommentars.
Izkata