Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine Google云存储上的大规模重命名对象_Google App Engine_Google Cloud Storage_Gsutil - Fatal编程技术网

Google app engine Google云存储上的大规模重命名对象

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(或其他工具)在谷歌云存储上批量重命名对象?我正在试图找到一种方法,将一组图像从*.JPG重命名为*.JPG。

是的,有可能:

gsutil支持URI通配符

编辑

作为bucket子目录支持的一部分,我们将*通配符更改为只匹配目录边界,并引入了新的**通配符

你在bucket下有目录吗?如果是这样的话,也许你需要进入每个目录或使用**

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并行来使用多个进程启动它
如果使用GNU Parallel,最好部署一个新实例来执行批量复制/重命名操作:

  • 首先:-列出要复制/重命名的文件(源和目标之间用空格或制表符分隔的文件),如下所示:
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