如何 gzip 文件同时将压缩内容打印到标准输出
How to gzip a file while also printing compressed contents to 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
我想压缩一次写入磁盘,不想再打磁盘读取。
未经测试的代码
gzip
不会将多个文件压缩为一个文件。所以你可能需要一个像tar
这样的程序先把它打包然后再压缩。 tar 中有一个保留访问时间的选项。
gzip file*.txt && tar --atime-preserve=replace -czvf file.tar.gz file*.txt
这会在一行中完成您的要求:
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 {}'
使用 ls
、xargs
、bash
、cat
、gzip
、[=17 的 GNU 版本在 Linux 上进行了测试=]、touch
和 rm
.
我正在尝试压缩目录中的一系列文件,但也将压缩文件的内容打印到标准输出。
鉴于我有:
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
不会将多个文件压缩为一个文件。所以你可能需要一个像tar
这样的程序先把它打包然后再压缩。 tar 中有一个保留访问时间的选项。
gzip file*.txt && tar --atime-preserve=replace -czvf file.tar.gz file*.txt
这会在一行中完成您的要求:
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 {}'
使用 ls
、xargs
、bash
、cat
、gzip
、[=17 的 GNU 版本在 Linux 上进行了测试=]、touch
和 rm
.