2016-07-05 2 views
0

ディレクトリ内の一連のファイルを圧縮しようとしていますが、圧縮ファイルの内容をstdoutに出力しています。圧縮されたコンテンツをstdoutに出力しながらファイルをgzipにする方法

私が持っていることを考える:

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

私は基本的にgzip -c /tmp/file?.txt > /tmp/compressed.gzを実行するために探していますが、私はまた、ファイルは元のタイムスタンプを維持したまま圧縮することにしたい。

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

があります1つのコマンドでこれを行う方法はありません。

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

私は一度圧縮してディスクに書き込むことができます。また、ディスクをもう一度読み込んで再読み込みしたくない場合もあります。

+0

ファイルとstdoutに 'gzip .. 'で書き込むことができます。 tee file.gz'を実行し、 'touch 'でタイムスタンプを設定することができます。 –

+0

gzipは1つの入力ファイルで動作するので、最初にアーカイブを作成するにはtarのようなものを使う必要があります。または単にzipを使用してください。 – Marichyasana

答えて

1

これは、あなたが1行に求めているものを行います。

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

各入力ファイルは一度だけディスクから読み取られ、圧縮されたバージョンが二回保存されます。一度そのファイル* .txt.gzエントリに入れて、一度catch-all compressed.gzファイルに入れます。最後に、圧縮後のgzipファイルのタイムスタンプを調整します。

元のtxtファイルは削除されません。圧縮した後、各ファイルを削除するには:

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

lsxargsbashcatgzipteetouchrmのGNUバージョンでLinux上でテストされています。

0

未テストコード

gzipを1つに複数のファイルを圧縮しません。したがって、最初にバンドルしてから圧縮するには、tarのようなプログラムが必要な場合があります。 tarにアクセス時間を保存するオプションがあります。

gzip file*.txt && tar --atime-preserve=replace -czvf file.tar.gz file*.txt 
関連する問題