如何使用MinIO的mcli命令行工具流式下载文件并直接压缩?
实现MinIO文件/文件夹流式下载并压缩(无需存盘)
单个文件流式压缩
你的思路是可行的,只需确保mcli将文件内容输出到标准输出(stdout),再通过管道传递给zip。建议给压缩包内的文件指定正确名称,避免解压后出现默认的-文件名:
mcli get myinstance/output/file.csv - | zip --name file.csv myfile.zip -
mcli get ... -:让mcli将文件内容输出到stdout而非本地文件--name file.csv:告诉zip将stdin中的内容命名为file.csv存入压缩包zip ... -:让zip从stdin读取内容完成压缩
文件夹递归流式压缩
如果要处理整个文件夹,需要逐个流式下载文件夹内的文件并追加到zip包中,全程无需本地存储。可以结合mcli ls遍历文件,再通过循环逐个处理:
mcli ls -r myinstance/output/ | awk '{print $NF}' | while read file; do mcli get myinstance/output/"$file" - | zip --append --name "$file" myfolder.zip - done
mcli ls -r:递归列出目标文件夹下的所有文件awk '{print $NF}':提取文件名(过滤掉mcli ls输出的日期、大小等冗余信息)while read file:遍历每个文件zip --append:将当前文件的流式内容追加到zip包中(首次执行会自动创建新包)
如果文件夹内有大量小文件,上述循环方式会多次调用zip,效率略低。若追求更高效率,可结合tar先创建流式归档,再转换为zip:
mcli get -r myinstance/output/ - | tar cf - -T - | zip myfolder.zip -
注:这种方式依赖tar与zip的协同兼容,部分环境可能需要调整参数以确保tar能正确读取mcli输出的文件列表和内容。
内容的提问来源于stack exchange,提问作者Fabian
相关产品推荐
相关产品推荐

