Ich habe eine große Anzahl von Dateien mit Erweiterungen wie .0_1234
.0_4213
und .0_4132
usw. Einige davon sind gzip
komprimiert und andere sind rohe E-Mails. Ich muss feststellen, welche Dateien komprimiert sind, diese dekomprimieren und alle Dateien in eine gemeinsame Erweiterung umbenennen, sobald alle komprimierten Dateien dekomprimiert sind. Ich habe festgestellt, dass ich mit dem Befehl file bestimmen kann, welche komprimiert werden sollen, dann die Ergebnisse sed
abrufen und die Ausgabe auf eine Liste von Dateien reduzieren kann, aber nicht bestimmen kann, wie die scheinbar zufälligen Erweiterungen dekomprimiert werden sollen. Folgendes habe ich bisher
file *|grep gzip| sed -e 's/: .*$//g'
Ich möchte xargs
oder etwas verwenden, um die Liste der in der Ausgabe bereitgestellten Dateien zu übernehmen und sie entweder umzubenennen, .gz
damit sie dekomprimiert werden können, oder sie einfach inline zu dekomprimieren.
quelle
Antworten:
Nicht verwenden
gzip
,zcat
stattdessen verwenden, was keine Erweiterung erwartet. Sie können das Ganze auf einmal erledigen. Versuchen Sie es einfach mitzcat
der Datei. Wenn dies fehlschlägt, weil sie nicht komprimiert ist, versuchencat
Sie stattdessen Folgendes:Das obige Skript versucht zuerst, in
zcat
die Datei zu gelangen,temp
und wenn dies fehlschlägt (wenn die Datei nicht im gzip-Format vorliegt), wird es genau dascat
tun. Dies wird in einer Subshell ausgeführt, um die Ausgabe des ausgeführten Befehls zu erfassen und in eine temporäre Datei (temp
) umzuleiten . Anschließend wird dastemp
in den ursprünglichen Dateinamen plus eine Erweiterung (.ext
in diesem Beispiel) umbenannt und das Original gelöscht.quelle
"$f".ext
bereits vorhandene. Oder verwendenmv -i
.zcat
verwendet wird,gzip
aber auf meinem System kann ich zumindestgzip
keine Dateien ohne.gz
Erweiterung akzeptieren, und dies umgeht dieses Problem. Wie würde ich es auf einmal machen?gunzip
besteht darin, dassgunzip
die Änderungszeit erhalten bleibt.Sie könnten so etwas tun
Dies verarbeitet alle Dateien (auch die unkomprimierten über
-f
) und schreibt (über-c
) die Ausgabe mithilfe der Umleitung in stdout , um den Inhalt jeder Datei auf ihrem.some_ext
Gegenstück zu speichern . Sie können dann die Originale zB mit entfernenbash
oder
zsh
Sie können die resultierenden Dateien sogar in einem anderen Verzeichnis speichern (diesmal unter der Annahme, dass Sie die ursprüngliche Erweiterung entfernen möchten), z
und dann alles im aktuellen Verzeichnis entfernen ...
quelle
-f
Option von gzip, nicht komprimierte Daten unverändert weiterzugeben, der richtige Weg, also +1.Daraufhin wird eine Liste aller mit gzip komprimierten Dateien angezeigt:
.gz
Dieser hässliche Hack kann Folgendes bewirken, um eine Erweiterung für komprimierte Dateien zu erstellen:quelle