根据文件名将 Google Cloud 存储桶中的多个文件复制到不同的目录

Posted

技术标签:

【中文标题】根据文件名将 Google Cloud 存储桶中的多个文件复制到不同的目录【英文标题】:Copying multiple files inside a Google Cloud bucket to different directories based on file name 【发布时间】:2019-10-22 07:55:16 【问题描述】:

假设我在不同的子目录中有多个文件,名称如20060630 AD8,11 +1015.WAV20050508_Natoa_Enc1_AD5AK_1.WAV。现在我知道所有这些文件都会有一个子字符串,如AD(在第一个文件中)和ADAK(在第二个文件中)。我在***目录中将这些类(ADAKAN 等)作为空文件夹创建了总共 16 个。

我想根据匹配的子字符串将所有这些文件复制到它们各自的目录中。现在使用gsutil,命令可能如下:

gsutil cp gs://bucket/Field/2005/20060630 AD8,11 +1015.WAV gs://bucket/AD/20060630 AD8,11 +1015.WAV

这种方法如何为同一存储桶中的数千个文件自动执行任务?

假设这样的方法是否安全:

if 'AD' in filename:
    gsutil cp gs://bucket/<filename> gs://bucket/AD/<filename>
elif 'AK' in filename:
    gsutil cp gs://bucket/<filename> gs://bucket/AK/<filename>

【问题讨论】:

【参考方案1】:

您可以为此编写一个简单的 BASH 脚本。由于gsutil supports wildcards,代码将非常简单,它可以递归地深入子目录以查找您的文件。

#!/bin/bash

bucket_name=my-example-bucket
substring_list=(
  AD
  AK
  AN
)

for substring in "$substring_list[@]"; do
   gsutil cp gs://$bucket_name/**/*$substring* gs://$bucket_name/$substring/
done

我还看到您有一些 Python 经验,因此您可以选择使用 Python Client for Google Cloud Storage 以及类似的通配符策略。

【讨论】:

是否不需要身份验证,因为我将在 Google Colab 上运行它?此外,您的链接缺少“e”。 我不太了解 bash,但该代码不会将所有文件都扔到***目录而不是匹配的子字符串文件夹中吗? 感谢您指出链接错误。它已被修复。该代码会将每个文件复制到存储桶根级别的匹配子目录中。而且我对 Google Colab 并不熟悉,但无论您在何种环境中运行代码,都必须通过您的 GCP 帐户进行身份验证才能在其中执行任何操作。

以上是关于根据文件名将 Google Cloud 存储桶中的多个文件复制到不同的目录的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助根据 BigQuery 中的值将 Google Cloud Storage 中的特定 PDF 文件移动到 SFTP

从 Google Cloud Storage Bucket 下载文件夹

Cloud Storage 上的 Google App Engine 文件

如何检索云存储桶中的最新文件?

我可以从 Google Cloud Storage 工件存储桶中删除容器映像吗?

如何使用 API 存储在 Google Cloud Storage 中的架构文件在 BigQuery 加载作业上设置架构?