如何在将压缩内容打印到stdout的同时gzip文件

时间:2016-07-05 20:36:40

标签: linux pipe gzip ksh

我正在尝试压缩目录中的一系列文件,但也会将压缩文件的内容打印到stdout。

鉴于我有:

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

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

2 个答案:

答案 0 :(得分: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上使用GNU版lsxargsbashcatgziptee,{{1 }和touch

答案 1 :(得分:0)

未经测试的代码

gzip不会将多个文件压缩为一个。因此,您可能需要像tar之类的程序首先捆绑它然后压缩。可以选择保留tar中的访问时间。

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