2016-07-05 56 views
0

我试图压缩目录中的一系列文件,但也打印压缩文件的内容到标准输出。如何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 

有任何方式使用一个命令做到这一点,并且不需要:

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

我会l ike压缩并写入磁盘一次,并且不想再次点击磁盘进行读取。

+0

你可以用'gzip .. |写入文件和stdout。 tee file.gz',你可以用'touch'设置时间戳。 –

+0

gzip适用于单个输入文件,所以您需要使用类似tar的东西来首先创建归档。或者只是使用zip。 – Marichyasana

回答

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 {}' 

测试的Linux系统上的lsxargsbashcatgzipteetouchrm的GNU版本。

0

未经测试的代码

gzip不压缩多个文件合并成一个。因此,您可能需要像tar这样的程序先捆绑它然后压缩。有一个选项可以保留tar中的访问时间。

gzip file*.txt && tar --atime-preserve=replace -czvf file.tar.gz file*.txt 
相关问题