Google cloud storage 使用gsutil移动多个文件

Google cloud storage 使用gsutil移动多个文件,google-cloud-storage,move,gsutil,Google Cloud Storage,Move,Gsutil,假设我在谷歌云存储桶中有以下文件: file_A1.csv file_B2.csv file_C3.csv 现在我想移动这些文件的一个子集,比如说file_A1.csv和file_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 这种方法需要两次调用几乎相同的命令,并分别移动

假设我在谷歌云存储桶中有以下文件:

file_A1.csv
file_B2.csv
file_C3.csv
现在我想移动这些文件的一个子集,比如说
file_A1.csv
file_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
选项来加速这个过程。然而,不幸的是,我只想移动所有文件的一个子集,并在bucket中保持其余文件不变


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

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


请注意,这是基于的语法,它也不支持您要求的功能。

如果您有要移动的文件列表,可以使用from
cp
命令,根据,该命令对
mv
命令也有效:

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

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

  • 源文件夹名称:
    旧文件夹
  • 新文件夹名称:
    new\u文件夹
`gsutil ls“gs:///old_文件夹”中x的
;doy=$(basename--“$x”);gsutil mv${x}gs:///新文件夹//${y};完成

缺少
-m
标志是这里真正的障碍。面对同样的问题,我最初是通过使用python多处理和
os.system
调用gsutil来解决这个问题的。我有6万份文件,需要几个小时。通过一些实验,我发现使用python客户端的速度提高了20倍

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

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

注意:该方法是一个元组(目标名称,异常),您可以将其弹出到数据帧或其他内容中查找失败

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)

是的,我已经考虑过了。但是,允许同时执行的并发命令是否有限制?只有正常的操作系统限制才适用;这个工具本身可以同时执行任意次数。好的,我写了一个小脚本,可以并行移动100个文件。结果只移动了25个文件,整个过程耗时10分钟。绝对不是一个解决方案。你对目的地的名称有规定吗?这是否也存在于文件中,或者是“重复现有文件的最后一个字母”,或者是更详细的说明?
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)