使用gsutil -m递归下载Cloud Storage存储桶文件失败,求解决方案
问题描述
尝试递归复制Cloud Storage存储桶中的所有文件,执行命令:
gsutil -m cp -r gs://{{ src_bucket }} {{ bucket_backup }}
每次执行都会报错:
CommandException: 1个文件/对象无法传输。
未传输的文件数量每次都不一样。试过减少-m选项的线程/进程数,问题依旧。存储桶内有170 MiB数据,约300k个文件,需要尽快完成下载。
更新:添加-L标志查看日志后,发现多条类似错误:
[Errno 2] 没有那个文件或目录: '<path>/en_.gstmp' -> '<path>/en'
解决建议
禁用临时文件重命名机制:
这个错误源于gsutil并行模式下,下载时先创建.gstmp临时文件,完成后再重命名为目标文件,高并发下易出现文件系统竞争(比如临时文件被意外处理、重命名时机冲突)。通过环境变量关闭该机制:export GSUTIL_CPU_TEMP_FILES=0 gsutil -m cp -r gs://{{ src_bucket }} {{ bucket_backup }}此方式会直接下载到目标路径,跳过临时文件阶段,避免重命名报错。
分片批量下载:
针对大量小文件场景,按前缀分批处理降低单命令并发压力:# 列出所有文件并保存到列表 gsutil ls gs://{{ src_bucket }}/** > file_list.txt # 按每1000个文件为一批循环下载 split -l 1000 file_list.txt batch_ for batch in batch_*; do gsutil -m cp -I {{ bucket_backup }} < "$batch" rm "$batch" done rm file_list.txt检查本地文件系统状态:
确保目标路径{{ bucket_backup }}所在文件系统有足够读写权限,且IO性能能支撑大量小文件并发操作。若使用机械硬盘,高并发小文件操作易出现IO阻塞,换成SSD可缓解此类问题。单线程兜底+校验补全:
若上述方法无效,先改用单线程完成基础下载(速度慢但保证完整性):gsutil cp -r gs://{{ src_bucket }} {{ bucket_backup }}再用同步命令校验并补全缺失文件:
gsutil rsync -r gs://{{ src_bucket }} {{ bucket_backup }}
内容的提问来源于stack exchange,提问作者DISCO
相关产品推荐
相关产品推荐

