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 gzip
die 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 gz
an einer beliebigen Stelle im Dateinamen enthalten, nicht nur am Ende.¹ Sie müssen auch beachten, dass das Parsen der Ausgabe ls
gefährlich ist, wenn Dateinamen Leerzeichen, Zeilenumbrüche usw. enthalten.
Eine sauberere Lösung, die nicht darauf angewiesen ist, gzip
Dateien mit einer Endung zu überspringen .gz
, ist, dass sie auch nicht komprimierte Dateien in Unterverzeichnissen verarbeitet:
find . -type f ! -name "*.gz" -exec gzip {} \;
¹ Wie izkata
kommentiert: Die Verwendung .gz
allein zur Verbesserung würde nicht funktionieren. Sie müssten grep -vF .gz
oder verwenden grep -v '\.gz$'
. Das birgt immer noch die Gefahr, die ls
Ausgabe von ' zu verarbeiten.