Sid
Sid

Reputation: 163

move files between directories in single GCP bucket

I am trying to set up cloud functions to move files between folders inside one bucket in GCP.

Whenever the user loads files into the provided bucket folder, my cloud functions move the file to another folder where big data scripts are looking after.

It shows successful while setting up, however, files are not moving from the source folders.

enter image description here

Appreciate your help

from google.cloud import storage

def move_file(bucket_name, bucket_Folder, blob_name):
    """Moves a blob from one folder to another with the same name."""
    bucket_name = 'bucketname'
    blob_name = 'filename'

    storage_client = storage.Client()

    bucket = storage_client.get_bucket(bucket_name)
    source_blob = bucket.blob("Folder1/" + blob_name)
    new_blob = bucket.copy_blob(source_blob, bucket, "Folder2/" + blob_name)
    blob.delete()

    print('Blob {} in bucket {} copied to blob {} .'.format(source_blob.name, bucket.name, new_blob.name))

Upvotes: 2

Views: 5440

Answers (2)

Maxim
Maxim

Reputation: 4431

From the code you provided, the variable blob is not defined anywhere, so the source file won't be deleted. Instead of blob.delete(), change that line to source_blob.delete().

Also, I assume you are aware that you're "moving" just a single file. If you want to move all files prefixed with Folder1/ to Folder2 you could do something like this instead:

from google.cloud import storage

def move_files(self):

    storage_client = storage.Client()

    bucket = storage_client.get_bucket('bucketname')
    blobs = bucket.list_blobs(prefix='Folder1/')

    for blob in blobs:
     bucket.rename_blob(blob, new_name=blob.name.replace('Folder1/', 'Folder2/'))

For the latter, I reckon that there could be more efficient or better ways to do it.

Upvotes: 5

Chris32
Chris32

Reputation: 4961

If you are just moving the object inside of the same bucket you can just rename the object with the desired route.

In Google Cloud Platform Storage there are no folders, just the illusion of them. Everything after the name of the bucket is part of the name of the object.

Also, I can see many errors in your function. You can use this generic function to move a blob from one folder to another inside of the same bucket:

from google.cloud import storage def rename_blob(bucket_name, blob_name, new_name): """Renames a blob.""" # bucket_name = "your-bucket-name" # blob_name = "folder/myobject" # new_name = "newfolder/myobject"

storage_client = storage.Client()
bucket = storage_client.bucket(bucket_name)
blob = bucket.blob(blob_name)

new_blob = bucket.rename_blob(blob, new_name)

print("Blob {} has been renamed to {}".format(blob.name, new_blob.name))

Upvotes: 2

Related Questions