是否可以使用 gsutil(或其他工具)在 Google Cloud Storage 上批量重命名对象?我正在想办法将一堆图像从 *.JPG 重命名为 *.jpg。
4 回答
这是在 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
该解决方案推送 2 个列表,一个用于源文件,一个用于目标文件(用于“gsutil mv”命令):
gsutil ls gs://bucket_name/*.JPG > src-rename-list.txt
sed 's/\.JPG/\.jpg/g' src-rename-list.txt > dest-rename-list.txt
使用以下代码将“gsutil mv”行和两个文件逐行连接起来:
paste -d ' ' src-rename-list.txt dest-rename-list.txt | sed -e 's/^/gsutil\ mv\ /'
然后在一个while循环中运行每一行:while read line; 做 bash -c "$line"; 完毕
最后,清理并删除创建的文件:
rm src-rename-list.txt; rm dest-rename-list.txt
以上内容已针对工作中的 Google Storage 存储桶进行了测试。
https://cloud.google.com/storage/docs/gsutil/addlhelp/WildcardNames
gsutil 支持 URI 通配符
编辑
作为桶子目录支持的一部分,我们更改了 * 通配符以仅匹配目录边界,并引入了新的 ** 通配符...
你有桶下的目录吗?如果是这样,也许您需要深入到每个目录或使用**。
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 到目前为止(截至 14 年 4 月 12 日)
下界API不支持目的地通配符。
所以此时您需要检索所有 JPG 文件的列表,并重命名每个文件。
蟒蛇示例:
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)
请注意,这需要几个小时。
gsutil 不支持并行化和批量复制/重命名。
你有两个选择:
- 使用数据流过程来执行操作或
- 使用 GNU 并行使用多个进程启动它
如果您使用 GNU Parallel,最好部署一个新实例来执行批量复制/重命名操作:
- 首先: - 列出要复制/重命名的文件(源和目标由空格或制表符分隔的文件),如下所示:
gs://origin_bucket/path/file gs://dest_bucket/new_path/new_filename
- 第二:启动一个新的计算实例
- 第三:在该实例中登录并并行安装 Gnu
sudo apt install parallel
- 第三:使用 google(gcloud auth login)授权自己,因为计算的服务帐户可能无权移动/重命名文件。
gcloud auth login
- 并行进行复制 (gsutil cp) 或移动 (gsutil mv) 操作:
parallel -j 20 --colsep ' ' gsutil mv {1} {2} :::: file_with_source_destination_uris.txt
这将使 gsutil cp 操作并行运行 20 次。
对的,这是可能的: