Google app engine Google云存储上的大规模重命名对象
是否可以使用gsutil(或其他工具)在谷歌云存储上批量重命名对象?我正在试图找到一种方法,将一组图像从*.JPG重命名为*.JPG。是的,有可能: gsutil支持URI通配符 编辑 作为bucket子目录支持的一部分,我们将*通配符更改为只匹配目录边界,并引入了新的**通配符 你在bucket下有目录吗?如果是这样的话,也许你需要进入每个目录或使用**Google app engine Google云存储上的大规模重命名对象,google-app-engine,google-cloud-storage,gsutil,Google App Engine,Google Cloud Storage,Gsutil,是否可以使用gsutil(或其他工具)在谷歌云存储上批量重命名对象?我正在试图找到一种方法,将一组图像从*.JPG重命名为*.JPG。是的,有可能: gsutil支持URI通配符 编辑 作为bucket子目录支持的一部分,我们将*通配符更改为只匹配目录边界,并引入了新的**通配符 你在bucket下有目录吗?如果是这样的话,也许你需要进入每个目录或使用** gsutil -m mv gs://my_bucket/**.JPG gs://my_bucket/**.jpg 或 编辑 gsu
gsutil -m mv gs://my_bucket/**.JPG gs://my_bucket/**.jpg
或
编辑gsutil目前不支持目标的通配符(截至2014年4月12日)
虚空 所以现在您需要检索所有JPG文件的列表, 并重命名每个文件 python示例:
import subprocess
files = subprocess.check_output("gsutil ls gs://my_bucket/*.JPG",shell=True)
files = files.split("\n")[:-1]
for f in files:
subprocess.call("gsutil mv %s %s"%(f,f[:-3]+"jpg"),shell=True)
请注意,这将花费数小时。下面是在bash中执行此操作的本机方法,并逐行解释代码:
gsutil ls gs://bucket_name/*.JPG > src-rename-list.txt
sed 's/\.JPG/\.jpg/g' src-rename-list.txt > dest-rename-list.txt
paste -d ' ' src-rename-list.txt dest-rename-list.txt | sed -e 's/^/gsutil\ mv\ /' | while read line; do bash -c "$line"; done
rm src-rename-list.txt; rm dest-rename-list.txt
解决方案推送两个列表,一个用于源文件,另一个用于目标文件(将在“gsutil mv”命令中使用):
行“gsutil mv”和两个文件使用以下代码逐行连接:
paste -d ' ' src-rename-list.txt dest-rename-list.txt | sed -e 's/^/gsutil\ mv\ /'
然后在while循环中运行每一行:
读行时;dobash-c“$line”;完成
最后,清理并删除创建的文件:
rm src-rename-list.txt; rm dest-rename-list.txt
以上内容已针对工作的Google存储桶进行了测试。gsutil不支持并行化和大容量复制/重命名 您有两个选择:
- 使用数据流进程执行该操作 或
- 使用GNU并行来使用多个进程启动它
- 首先:-列出要复制/重命名的文件(源和目标之间用空格或制表符分隔的文件),如下所示:
gs://origin\u bucket/path/file gs://dest\u bucket/new\u path/new\u filename
- 第二:启动一个新的计算实例
- 第三:登录该实例并安装Gnu并行
sudo-apt-install-parallel
- 第三:使用google(gcloud auth login)对自己进行授权,因为compute的服务帐户可能没有移动/重命名文件的权限
gcloud身份验证登录
- 以并行方式执行复制(gsutil cp)或移动(gsutil mv)操作:
parallel-j20--colsep''gsutil mv{1}{2}::::file_with_source_destination_uris.txt
这将使gsutil cp操作并行运行20次。尝试以下操作:
gsutil mv gs://BUCKET_NAME/OLD_OBJECT_NAME gs://BUCKET_NAME/NEW_OBJECT_NAME
来源:看到了,但不太确定它如何帮助我批量重命名对象?@Andrei,但我不能在我的gae项目上使用gsutil+子流程。在gae项目中不需要gsutil。您只需检索代码中的对象列表并重命名即可。@AndreiVolgin目前我正在使用它来复制、列出、统计和删除存储在gcs中的文件。我还需要实现重命名文件夹。该客户端库没有任何重命名方法。因此,我要做的是,1.创建一个新文件夹。2.将旧文件夹的所有内容复制到新文件夹中。3.删除旧文件夹。但这似乎是一个漫长的过程..Hmmm似乎不起作用,提出了“CommandException:Destination(gs://my_bucket/*.jpg)必须完全匹配1个URL”我编辑:)对不起,我现在没有环境要测试,如果不起作用,我会测试其他方法,因为目录是正确的。我认为问题在于它不能进行通配符替换?事实上它不起作用。在检索文件列表后,似乎必须逐个重命名,甚至效率低下。。而且GCS API似乎没有复制/重命名功能..喜欢这个解决方案,只有小注释,而不是:gsutil ls gs://bucket\u name/*.JPG|sed's/\.JPG/\.JPG/g'>dest-rename-list.txt简化为:cat src-rename-list.txt;sed's/\.JPG/\.JPG/g'>dest-rename-list.txt
rm src-rename-list.txt; rm dest-rename-list.txt
gsutil mv gs://BUCKET_NAME/OLD_OBJECT_NAME gs://BUCKET_NAME/NEW_OBJECT_NAME