谷歌云存储:gsutil cp -n 不会“跳过现有”或显示正在上传的文件

Posted

技术标签:

【中文标题】谷歌云存储:gsutil cp -n 不会“跳过现有”或显示正在上传的文件【英文标题】:Google cloud storage: gsutil cp -n doesn't "skip existing" or display files being uploaded 【发布时间】:2017-04-14 15:54:12 【问题描述】:

恢复上传时(已经上传了大约 2GB,从 40Gb、7,000 个文件中上传了 2,000 个文件)cp 也不会显示“跳过现有文件”列表。此外,gsutil 消息[xx/7.3k files][xx MiB/ 40GiB] 不会从停止时的左侧开始(ei:[2k/7.3k files][2GiB/ 40GiB]),而是从头开始:[00/7.3k files][00 MiB/ 40GiB]

我检查了https://console.cloud.google.com/storage/browser 上的上传:似乎没什么奇怪的,正在上传新文件,昨天发送的文件仍然存在。那为什么gsutil不说网上已经有2GiB和2k的文件了呢?

此外,cp 命令不会像以前那样显示它当前正在上传的文件。知道为什么吗? (虽然 rsync 确实如此)

这是我的 cp 命令gsutil -m cp -r -n "MyLocalFolder" gs://my_bucket/Backup 我也没有修改我的本地文件夹,也没有修改它包含的文件。


我遇到的另一个问题是-m rsync -r 命令尝试上传已经存在的文件而不是跳过它们。为了调试,我在cprsync 命令之间切换了几次,而rsync 没有完全考虑cp 命令已经上传的内容:它一直在上传现有文件。那么cprsync 有不同的校验和吗?如果不是,如何解释这种行为?

第二个问题的解决方案: 事实上,我对 cp 和 rsync 使用了相同的目标,但没有以相同的方式构建: 如果cp命令是gsutil -m cp -r -n "MyLocalFolder" gs://my_bucket/Backup那么rsync命令是gsutil -m rsync -r "MyLocalFolder" gs://my_bucket/Backup/MyLocalFolder

【问题讨论】:

我发布了一个答案,但是如果您发现某些您认为是错误的东西,您能否创建一个简单的文件夹和一组命令来重现它并将邮件发送到 gs-team@google.com?谢谢。 【参考方案1】:

gsutil cp -n 仍然需要发现本地文件夹中的哪些文件需要上传(因为文件夹的内容可能已更改),因此如果您重复该命令并且目标存储桶中有一些现有文件,它仍然即使要跳过它们,也需要枚举本地文件。这就是为什么它不会从 [2k / 7.3k files] [2GiB / 40GiB] 之类的东西开始。

但它仍应为已存在的项目输出“Skipping existing item”。

rsync 使用与 cp 相同的校验和逻辑,所以我怀疑您没有将文件上传到完全相同的目的地。

gsutil 4.21 版更改了cprsync 命令以显示摘要信息而不是每个文件的单独进度打印,这往往会向终端打印大量信息,特别是当@987654328使用了@标志。

【讨论】:

是的,它没有启动是合乎逻辑的,就在我启动它时,[2k / 7.3k files] [2GiB / 40GiB] 但据我了解,它应该在一段时间后(枚举本地和远程文件的时间) 显示[2k / 7.3k files] [2GiB / 40GiB]。我最多不明白,几分钟后我得到:[0k / 7.3k files] [100MB / 40GiB](可能是我停止 gsutil 时正在上传的文件)。 同样对于 rsync,我正在上传到同一个位置(我使用相同的命令,我只是将 -m cp -r -n 替换为 -m rsync -r,因此本地和远程位置保持不变)。如果我理解正确,gsutil 4.21 用于 cp 和 rsync 的正常行为将显示(在我的情况下)2000 行跳过项目,然后只显示定期更新的这一行(ei,[2k / 7.3k files] [2GiB / 40GiB],然后是3k / 7.3k files] [2.1GiB / 40GiB] ...)。对吗? 这有点正确,它会在枚举项目时跳过它们,所以你最终会得到 2000 条跳过的行。我认为如果您需要更多调试细节,我们应该使用可重现的示例。

以上是关于谷歌云存储:gsutil cp -n 不会“跳过现有”或显示正在上传的文件的主要内容,如果未能解决你的问题,请参考以下文章

gsutil cp 命令错误,CommandException:没有匹配的 URL:

从谷歌云存储到 s3 的 gsutil rsync 挂在大文件上

通过 gsutils 和谷歌云存储下载谷歌播放控制台统计信息

如何使用 gsutil 通过 http 链接从谷歌云存储下载到 AWS 实例或 s3 存储桶?

谷歌云存储 - 从网络下载文件

python中的gsutil cp通过os.system