使用 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 复制文件后,它们不会立即从本地存储中删除的主要内容,如果未能解决你的问题,请参考以下文章