如何通过 ZIP 管道传输并在存档中使用可用的文件名
How to pipe through ZIP and have a usable filename inside the archive
我正在寻找一种方法来压缩存储在 google-bucket 中的(大)文件并将压缩文件也写入 google-bucket。
这个命令序列工作得又快又好:
gsutil cat gs://bucket/20190515.csv | zip | gsutil cp - gs://bucket/20190515.csv.zip
...但是问题是ZIP里面的文件名有无用的名字“-”。
另一方面,如果我使用序列:
gsutil cp gs://bucket/20190515.csv .
zip -m 20190515.csv.zip 20190515.csv
gsutil mv 20190515.csv.zip gs://bucket/20190515.csv.zip
...然后我在 ZIP 中得到了一个可用的名称 - 但该命令需要非常长的时间并且需要相应大的(虚拟)硬盘。
感谢meuh的指点,我现在有了解决办法:
#!/usr/bin/python3
import sys, zipstream
with zipstream.ZipFile(mode='w', compression=zipstream.ZIP_DEFLATED) as z:
z.write_iter(sys.argv[1], sys.stdin.buffer)
for chunk in z:
sys.stdout.buffer.write(chunk)
..存储为streamzip.py。
然后调用如下:
fn="bucket/20190515.csv"
execCmd("gsutil cat gs://%s | streamzip.py %s | gsutil cp - gs://%s.zip"%(fn, fn.split("/")[-1], fn))
...给出了想要的结果。
我正在寻找一种方法来压缩存储在 google-bucket 中的(大)文件并将压缩文件也写入 google-bucket。
这个命令序列工作得又快又好:
gsutil cat gs://bucket/20190515.csv | zip | gsutil cp - gs://bucket/20190515.csv.zip
...但是问题是ZIP里面的文件名有无用的名字“-”。
另一方面,如果我使用序列:
gsutil cp gs://bucket/20190515.csv .
zip -m 20190515.csv.zip 20190515.csv
gsutil mv 20190515.csv.zip gs://bucket/20190515.csv.zip
...然后我在 ZIP 中得到了一个可用的名称 - 但该命令需要非常长的时间并且需要相应大的(虚拟)硬盘。
感谢meuh的指点,我现在有了解决办法:
#!/usr/bin/python3
import sys, zipstream
with zipstream.ZipFile(mode='w', compression=zipstream.ZIP_DEFLATED) as z:
z.write_iter(sys.argv[1], sys.stdin.buffer)
for chunk in z:
sys.stdout.buffer.write(chunk)
..存储为streamzip.py。 然后调用如下:
fn="bucket/20190515.csv"
execCmd("gsutil cat gs://%s | streamzip.py %s | gsutil cp - gs://%s.zip"%(fn, fn.split("/")[-1], fn))
...给出了想要的结果。