【问题标题】:How to gzip a file while also printing compressed contents to stdout如何在压缩文件的同时将压缩内容打印到标准输出
【发布时间】:2016-07-05 20:36:40
【问题描述】:

我正在尝试压缩一个目录中的一系列文件,但还将压缩文件的内容打印到标准输出。

鉴于我有:

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

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

【问题讨论】:

  • gzip .. | tee file.gz可以写入文件和stdout,touch可以设置时间戳。
  • gzip 适用于单个输入文件,因此您需要先使用 tar 之类的东西来制作存档。或者只使用 zip。

标签: linux pipe gzip ksh


【解决方案1】:

这可以满足您的要求:

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

每个输入文件只从磁盘读取一次,压缩版本保存两次;一次在其文件*.txt.gz 条目中,一次在包罗万象的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 版本进行测试。

【讨论】:

    【解决方案2】:

    未经测试的代码

    gzip 不会将多个文件压缩为一个。所以你可能需要像tar 这样的程序先捆绑然后压缩。有一个选项可以在 tar 中保留访问时间。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多