【问题标题】:Moving multiple files with gsutil使用 gsutil 移动多个文件
【发布时间】:2015-07-08 20:36:44
【问题描述】:

假设我在 Google Cloud Storage 存储分区中有以下文件:

file_A1.csv
file_B2.csv
file_C3.csv

现在我想移动这些文件的一个子集,比如说file_A1.csvfile_B2.csv。目前我是这样做的:

gsutil mv gs://bucket/file_A1.csv gs://bucket/file_A11.csv
gsutil mv gs://bucket/file_B2.csv gs://bucket/file_B22.csv

这种方法需要两次调用或多或少相同的命令并分别移动每个文件。我知道,如果我移动一个完整的目录,我可以添加-m 选项以加速此过程。但是,不幸的是,我只想移动所有文件的一个子集,并将其余文件保留在存储桶中。

以这种方式移动 100 个文件时,我需要执行 100 个左右的命令,这变得非常耗时。我有一种方法可以将 100 个文件中的每一个文件合并到一个命令中,并添加 -m 选项?

【问题讨论】:

  • 你对目的地的名字有什么规定吗?这也是在文件中,还是“重复现有文件的最后一个字母”,或者更详细的内容?

标签: google-cloud-storage move gsutil


【解决方案1】:

如果您有要移动的文件列表,可以使用cp 命令中的-I option,根据docs,该命令也适用于mv 命令:

cat filelist | gsutil -m mv -I gs://my-bucket

【讨论】:

  • 这就是我来这里的目的!
【解决方案2】:

gsutil 目前不支持此功能,但您可以创建多个 shell 脚本,每个脚本执行一部分移动,并同时运行它们。

请注意,gsutil mv 基于 unix mv command 的语法,它也不支持您要求的功能。

【讨论】:

  • 是的,我已经考虑过了。但是,允许同时执行的并发命令有限制吗?
  • 仅适用正常的操作系统限制;该工具本身可以同时执行任意次数。
  • 好的,我写了一个小脚本,可以并行移动 100 个文件。结果是只移动了 25 个文件,整个过程耗时 10 分钟。绝对不是解决方案。
【解决方案3】:

您可以使用 bash 通过迭代 gsutil ls 输出来实现,例如:

  • 源文件夹名称:old_folder
  • 新文件夹名称:new_folder
for x in `gsutil ls "gs://<bucket_name>/old_folder"`; do y=$(basename -- "$x");gsutil mv ${x} gs://<bucket_name>/new_folder/${y}; done

【讨论】:

    【解决方案4】:

    为此,您可以运行以下 gsutil 命令:

    gsutil mv gs://bucket_name/common_file_name*  gs://bucket_destiny_name/common_file_name*    
    

    在你的情况下; common_file_name 是“file_”

    【讨论】:

      【解决方案5】:

      缺少-m 标志才是真正的挂机。面对同样的问题,我最初通过使用 python 多处理和os.system 调用 gsutil 来解决这个问题。我有 60k 个文件,这需要几个小时。通过一些实验,我发现使用 python 客户端可以将速度提高 20 倍!

      如果您愿意离开 gsutil - 这是一个更好的方法。

      这是一个复制(或移动)方法。如果您创建一个 src 键/uri 列表,您可以使用多线程调用它以获得快速结果。

      注意:该方法是 (destination-name,exception) 的元组,您可以将其弹出到数据框或其他内容中以查找故障

      def cp_blob(key=None,bucket=BUCKET_NAME,uri=None,delete_src=False):
          try:
              if uri:
                  uri=re.sub('gs://','',uri)
                  bucket,key=uri.split('/',maxsplit=1)
              client=storage.Client()
              bucket=client.get_bucket(bucket)
              blob=bucket.blob(key)
              dest=re.sub(THING1,THING2,blob.name)  ## OR SOME OTHER WAY TO GET NEW DESTINATIONS
              out=bucket.copy_blob(blob,bucket,dest)
              if delete_src:
                  blob.delete()
              return out.name, None
          except Exception as e:
              return None, str(e)
      

      【讨论】:

        猜你喜欢
        • 2020-02-26
        • 2020-10-27
        • 1970-01-01
        • 1970-01-01
        • 2021-12-21
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        相关资源
        最近更新 更多