我们假设我在Google云端存储分区中收到了以下文件:
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
选项以加速此过程。但是,不幸的是,我只想移动所有文件的子集,并保持其余部分不受影响。
当以这种方式移动100个文件时,我需要执行100个命令,这会非常耗时。我有办法将100个文件中的每一个组合成一个命令,另外还有-m
选项吗?
答案 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)
答案 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)