使用gsutil移动多个文件

时间:2015-04-29 13:50:45

标签: google-cloud-storage move gsutil

我们假设我在Google云端存储分区中收到了以下文件:

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选项吗?

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

就你而言; common_file_name 是“file_”

答案 2 :(得分:0)

如果您有要移动的文件列表,则可以使用cp命令中的-I option,根据docs,该命令对{{ 1}}命令:

mv

答案 3 :(得分:0)

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

  • 源文件夹名称: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 :(得分:0)

缺少 -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)