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

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

Ich habe ein Verzeichnis mit Protokollen, für deren Komprimierung ich einen Job einrichten möchte.gzipDas Problem ist, dass ich die Protokolle, die ich bereits komprimiert habe, nicht erneut komprimieren möchte.

Ich habe versucht, zu verwenden 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, die nicht mit .gz endet, gzippen.

Antwort1

Sie können einfach Folgendes tun:

gzip *

gzip wird Ihnen mitteilen, dass es die Dateien überspringt, die bereits eine .gz Endung haben.
Wenn diese Meldung stört, können Sie Folgendes verwenden:

gzip -q *

Was Sie versucht haben, hat nicht funktioniert, weil gzipdie Dateinamen der zu komprimierenden Dateien nicht von stdin gelesen werden. Damit das funktioniert, müssten Sie Folgendes verwenden:

ls | grep -v gz | xargs gzip

Sie schließen Dateien aus, die das Muster gzan einer beliebigen Stelle im Dateinamen enthalten, nicht nur am Ende.¹ Sie müssen auch beachten, dass das Parsen der Ausgabe lsgefährlich ist, wenn Dateinamen Leerzeichen, Zeilenumbrüche usw. enthalten.

Eine sauberere Lösung, die nicht darauf angewiesen ist, gzipDateien mit einer Endung zu überspringen .gz, ist, dass sie auch nicht komprimierte Dateien in Unterverzeichnissen verarbeitet:

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



¹ Wie izkatakommentiert: Die Verwendung .gzallein zur Verbesserung würde nicht funktionieren. Sie müssten grep -vF .gzoder verwenden grep -v '\.gz$'. Das birgt immer noch die Gefahr, die lsAusgabe von ' zu verarbeiten.

verwandte Informationen