2016-07-05 4 views
0

Ich versuche, eine Reihe von Dateien in einem Verzeichnis zu komprimieren, sondern auch den Inhalt der komprimierten Dateien auf stdout.Wie gzip eine Datei, während auch komprimierte Inhalte zu stdout

Da ich habe:

09:00 /tmp/file1.txt 
10:00 /tmp/file2.txt 
11:00 /tmp/file3.txt 

Ich bin im Grunde ein gzip -c /tmp/file?.txt > /tmp/compressed.gz auszuführen suchen, aber ich will auch die Dateien mit Beibehaltung der ursprünglichen Zeitstempel komprimiert werden:

09:00 /tmp/file1.txt.gz 
10:00 /tmp/file2.txt.gz 
11:00 /tmp/file3.txt.gz 
12:00 /tmp/compressed.gz 

ist es Jede Möglichkeit, dies mit einem Befehl zu tun, und ohne:

for i in $(ls /tmp/file?.txt) 
do 
     gzip ${i} && cat ${i}.gz >> /tmp/compressed.gz 
done 

Ich würde l Sie müssen einmal komprimieren und auf die Festplatte schreiben und wollen die Festplatte nicht erneut lesen.

+0

Sie können mit 'gzip .. | in eine Datei schreiben und stdout tee.gz', und Sie können Zeitstempel mit 'touch' einstellen. –

+0

gzip arbeitet mit einer einzigen Eingabedatei, daher müssen Sie etwas wie tar verwenden, um zuerst ein Archiv zu erstellen. Oder benutze einfach zip. – Marichyasana

Antwort

1

Das tut, was Sie in einer Zeile fragen:

ls file*.txt | xargs -n1 -I'{}' bash -c 'cat {} | gzip - | tee {}.gz >> compressed.gz; touch {}.gz -r {}' 

Jede Eingabedatei von der Festplatte nur einmal gelesen wird, und die komprimierte Version zweimal gespeichert wird; einmal in seiner Datei * .txt.gz Eintrag, einmal in der catch-all compressed.gz Datei. Schließlich passt es den Zeitstempel der gezippten Datei nach der Komprimierung an.

Beachten Sie, dass dadurch die ursprüngliche TXT-Datei nicht gelöscht wird. So entfernen Sie jede Datei nach dem Komprimieren:

ls file*.txt | xargs -n1 -I'{}' bash -c 'cat {} | gzip - | tee {}.gz >> compressed.gz; touch {}.gz -r {}; rm {}' 

Getestet unter Linux mit den GNU-Versionen von ls, xargs, bash, cat, gzip, tee, touch und rm.

0

Ungeprüfte-Code

gzip nicht komprimieren nicht mehrere Dateien in einem. Möglicherweise benötigen Sie also ein Programm wie tar, um es zuerst zu bündeln und dann zu komprimieren. Es gibt eine Option, um die Zugriffszeit in tar zu erhalten.

gzip file*.txt && tar --atime-preserve=replace -czvf file.tar.gz file*.txt 
Verwandte Themen