批量重命名Google云端存储上的对象

时间:2014-11-27 08:49:10

标签: google-app-engine google-cloud-storage gsutil

是否可以使用gsutil(或其他工具)在Google云端存储上批量重命名对象?我想找到一种方法将一堆图像从* .JPG重命名为* .jpg。

5 个答案:

答案 0 :(得分:4)

<击> https://cloud.google.com/storage/docs/gsutil/addlhelp/WildcardNames

<击>
  

gsutil支持URI通配符

修改

gsutil 3.0 release note

  

作为存储桶子目录支持的一部分,我们更改了*通配符以仅匹配目录边界,并引入了新的**通配符......

你有目录吗?如果是这样,也许您需要转到每个目录或使用**。

gsutil -m mv gs://my_bucket/**.JPG gs://my_bucket/**.jpg

gsutil -m mv gs://my_bucket/mydir/*.JPG gs://my_bucket/mydir/*.jpg

<击> 修改
到目前为止,gsutil不支持目的地的通配符(截至4/12 / '14)
虚空API

所以此时您需要检索所有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)

请注意,这需要数小时。

答案 1 :(得分:2)

这是在bash中执行此操作的一种本机方式,下面逐行解释:

gsutil ls gs://bucket_name/*.JPG > src-rename-list.txt
gsutil ls gs://bucket_name/*.JPG | sed 's/\.JPG/\.jpg/g' > 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

该解决方案会推送2个列表,一个用于源文件,一个用于目标文件(将在“ gsutil mv”命令中使用):

gsutil ls gs://bucket_name/*.JPG > src-rename-list.txt
gsutil ls gs://bucket_name/*.JPG | sed 's/\.JPG/\.jpg/g' > dest-rename-list.txt

使用以下代码将“ gsutil mv”行和两个文件逐行连接:

paste -d ' ' src-rename-list.txt dest-rename-list.txt | sed -e 's/^/gsutil\ mv\ /'

然后在while循环中运行每一行:     边读边;做bash -c“ $ line”;完成

最后,清理并删除创建的文件:

rm src-rename-list.txt; rm dest-rename-list.txt

以上已针对正常工作的Google存储桶进行了测试。

答案 2 :(得分:1)

gsutil不支持并行化和批量复制/重命名。

您有两个选择:

  • 使用数据流过程进行操作 或
  • 使用GNU并行通过几个进程启动它

如果使用GNU Parallel,最好部署一个新实例来进行批量复制/重命名操作:

  • 首先:-列出要复制/重命名的文件(源和目标用空格或制表符分隔的文件),如下所示:
gs://origin_bucket/path/file gs://dest_bucket/new_path/new_filename
  • 第二:启动一个新的计算实例
  • 第三:在该实例中登录并并行安装Gnu
sudo apt install parallel
  • 第三:使用google(gcloud auth登录)授权自己,因为用于计算的服务帐户可能无权移动/重命名文件。
gcloud auth login
  • 并行执行复制(gsutil cp)或移动(gsutil mv)操作:
   parallel -j 20 --colsep ' ' gsutil mv {1} {2} :::: file_with_source_destination_uris.txt

这将使gsutil cp操作并行运行20次。

答案 3 :(得分:0)

答案 4 :(得分:-1)

试试这个:

 gsutil mv gs://BUCKET_NAME/OLD_OBJECT_NAME gs://BUCKET_NAME/NEW_OBJECT_NAME

来源:https://cloud.google.com/storage/docs/copying-renaming-moving-objects#rename