使用 gsutil 复制文件后,它们不会立即从本地存储中删除

Posted

技术标签:

【中文标题】使用 gsutil 复制文件后,它们不会立即从本地存储中删除【英文标题】:After copying files using gsutil, they are not deleted instantly from the local storage 【发布时间】:2019-06-06 12:40:59 【问题描述】:

我的任务是将本地数据库中的 CSV 文件上传到Google Cloud storage

为此,我首先将它们复制到我的桌面,然后将它们上传到Google Cloud storage

我希望这可以自动完成,无需我的参与。因此,我创建了一个由Task Scheduler 运行的 CMD 文件。 CMD文件的结构如下:

gsutil cp C:\Users\Myname\Desktop\test\*.csv gs://my-bucket

gsutil rm C:\Users\Myname\Desktop\test\*.csv

但在将数据加载到`Google Cloud 存储后,它不会删除 CSV 文件。

但是,如果您在单独的命令中运行删除,它会成功删除文件。

只是:

gsutil rm C:\Users\Myname\Desktop\test\*.csv

但我希望下载和删除代码在一个文件中。

我也尝试过这种方式(但它也没有帮助我):

gsutil cp C:\Users\Myname\Desktop\test\*.csv gs://my-bucket

del C:\Users\Myname\Desktop\test\*.csv

这个问题有什么解决办法?

【问题讨论】:

如果gsutil命令是.bat或.cmd文件,则需要使用CALL gsutil...。另见github.com/GoogleCloudPlatform/gsutil/issues/233 @lit,但上传 gsutil 命令可以在没有 CALL 的情况下正常工作 你为什么使用单独的 cp/rm 命令而不是 gsutil mv ? @LotPings,嗯...我不知道这个命令,但它似乎工作正常。谢谢!请在答案部分写下您的解决方案。 【参考方案1】:

gsutil mv 命令专为此用例而设计。

但是,请注意docs section about atomicity。尤其是从本地文件系统移动到云端,没有办法原子地上传和删除,所以命令会先上传,验证文件是否存储在云端,然后删除本地文件。

【讨论】:

不错的答案!在这里引用它的非原子性的相关部分: "[gsutil mv] 执行从源到目标的复制,然后删除每个对象的源。这样做的结果是,除了正常的网络和操作费用,如果您移动 Nearline Storage、Coldline Storage 或 Archive Storage 对象,则会产生删除和数据检索费用。"【参考方案2】:

问题是由gsutil 是一个脚本引起的。在 Windows 上,此脚本 (gsutil) 退出并停止进一步处理批处理文件中的命令。

解决方法是在gsutil前面加上call这个词:

call gsutil cp C:\Users\Myname\Desktop\test\*.csv gs://my-bucket

接下来,不要使用gsutil 删除本地文件。请改用del

【讨论】:

以上是关于使用 gsutil 复制文件后,它们不会立即从本地存储中删除的主要内容,如果未能解决你的问题,请参考以下文章

cloud/gsutil 将文件从实例复制到存储桶

如何跳过 gsutil rsync 中的现有文件

gsutil 重命名文件,因为它们是从不同目录复制的

我可以在本地开发服务器上使用 gsutil 吗?

管道 gsutil 输出到文件

如何使用 gsutil 从 GCE 上的容器中复制存储桶中的文件