Move objects by copying

Moving an object by copying in Cloud Storage consists of two operations. First, you copy the object to a destination bucket and rename the moved object. Next, you delete the original object. Delete an object only when the old and new destinations are not equal.

Explore further

For detailed documentation that includes this code sample, see the following:

Code sample

C++

For more information, see the Cloud Storage C++ API reference documentation .

To authenticate to Cloud Storage, set up Application Default Credentials. For more information, see Set up authentication for client libraries .

  namespace 
  
 gcs 
  
 = 
  
 :: 
 google 
 :: 
 cloud 
 :: 
 storage 
 ; 
 using 
  
 :: 
 google 
 :: 
 cloud 
 :: 
 StatusOr 
 ; 
 []( 
 gcs 
 :: 
 Client 
  
 client 
 , 
  
 std 
 :: 
 string 
  
 const 
&  
 bucket_name 
 , 
  
 std 
 :: 
 string 
  
 const 
&  
 old_object_name 
 , 
  
 std 
 :: 
 string 
  
 const 
&  
 new_object_name 
 ) 
  
 { 
  
 StatusOr<gcs 
 :: 
 ObjectMetadata 
>  
 metadata 
  
 = 
  
 client 
 . 
 RewriteObjectBlocking 
 ( 
  
 bucket_name 
 , 
  
 old_object_name 
 , 
  
 bucket_name 
 , 
  
 new_object_name 
 ); 
  
 if 
  
 ( 
 ! 
 metadata 
 ) 
  
 throw 
  
 std 
 :: 
 move 
 ( 
 metadata 
 ). 
 status 
 (); 
  
 google 
 :: 
 cloud 
 :: 
 Status 
  
 status 
  
 = 
  
 client 
 . 
 DeleteObject 
 ( 
 bucket_name 
 , 
  
 old_object_name 
 ); 
  
 if 
  
 ( 
 ! 
 status 
 . 
 ok 
 ()) 
  
 throw 
  
 std 
 :: 
 runtime_error 
 ( 
 status 
 . 
 message 
 ()); 
  
 std 
 :: 
 cout 
 << 
 "Renamed " 
 << 
 old_object_name 
 << 
 " to " 
 << 
 new_object_name 
 << 
 " in bucket " 
 << 
 bucket_name 
 << 
 " 
 \n 
 " 
 ; 
 } 
 

C#

For more information, see the Cloud Storage C# API reference documentation .

To authenticate to Cloud Storage, set up Application Default Credentials. For more information, see Set up authentication for client libraries .

  using 
  
  Google.Cloud.Storage.V1 
 
 ; 
 using 
  
 System 
 ; 
 public 
  
 class 
  
 MoveFileSample 
 { 
  
 public 
  
 void 
  
 MoveFile 
 ( 
  
 string 
  
 sourceBucketName 
  
 = 
  
 "your-unique-bucket-name" 
 , 
  
 string 
  
 sourceObjectName 
  
 = 
  
 "your-object-name" 
 , 
  
 string 
  
 targetBucketName 
  
 = 
  
 "target-object-bucket" 
 , 
  
 string 
  
 targetObjectName 
  
 = 
  
 "target-object-name" 
 ) 
  
 { 
  
 var 
  
 storage 
  
 = 
  
  StorageClient 
 
 . 
  Create 
 
 (); 
  
 storage 
 . 
 CopyObject 
 ( 
 sourceBucketName 
 , 
  
 sourceObjectName 
 , 
  
 targetBucketName 
 , 
  
 targetObjectName 
 ); 
  
 storage 
 . 
 DeleteObject 
 ( 
 sourceBucketName 
 , 
  
 sourceObjectName 
 ); 
  
 Console 
 . 
 WriteLine 
 ( 
 $"Moved {sourceObjectName} to {targetObjectName}." 
 ); 
  
 } 
 } 
 

Go

For more information, see the Cloud Storage Go API reference documentation .

To authenticate to Cloud Storage, set up Application Default Credentials. For more information, see Set up authentication for client libraries .

  import 
  
 ( 
  
 "context" 
  
 "fmt" 
  
 "io" 
  
 "time" 
  
 "cloud.google.com/go/storage" 
 ) 
 // moveFile moves an object into another location. 
 func 
  
 moveFile 
 ( 
 w 
  
 io 
 . 
  Writer 
 
 , 
  
 bucket 
 , 
  
 object 
  
 string 
 ) 
  
 error 
  
 { 
  
 // bucket := "bucket-name" 
  
 // object := "object-name" 
  
 ctx 
  
 := 
  
 context 
 . 
 Background 
 () 
  
 client 
 , 
  
 err 
  
 := 
  
 storage 
 . 
 NewClient 
 ( 
 ctx 
 ) 
  
 if 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 return 
  
 fmt 
 . 
 Errorf 
 ( 
 "storage.NewClient: %w" 
 , 
  
 err 
 ) 
  
 } 
  
 defer 
  
 client 
 . 
 Close 
 () 
  
 ctx 
 , 
  
 cancel 
  
 := 
  
 context 
 . 
 WithTimeout 
 ( 
 ctx 
 , 
  
 time 
 . 
 Second 
 * 
 10 
 ) 
  
 defer 
  
 cancel 
 () 
  
 dstName 
  
 := 
  
 object 
  
 + 
  
 "-rename" 
  
 src 
  
 := 
  
 client 
 . 
  Bucket 
 
 ( 
 bucket 
 ). 
  Object 
 
 ( 
 object 
 ) 
  
 dst 
  
 := 
  
 client 
 . 
  Bucket 
 
 ( 
 bucket 
 ). 
  Object 
 
 ( 
 dstName 
 ) 
  
 // Optional: set a generation-match precondition to avoid potential race 
  
 // conditions and data corruptions. The request to copy the file is aborted 
  
 // if the object's generation number does not match your precondition. 
  
 // For a dst object that does not yet exist, set the DoesNotExist precondition. 
  
 dst 
  
 = 
  
 dst 
 . 
 If 
 ( 
 storage 
 . 
  Conditions 
 
 { 
 DoesNotExist 
 : 
  
 true 
 }) 
  
 // If the destination object already exists in your bucket, set instead a 
  
 // generation-match precondition using its generation number. 
  
 // attrs, err := dst.Attrs(ctx) 
  
 // if err != nil { 
  
 // 	return fmt.Errorf("object.Attrs: %w", err) 
  
 // } 
  
 // dst = dst.If(storage.Conditions{GenerationMatch: attrs.Generation}) 
  
 if 
  
 _ 
 , 
  
 err 
  
 := 
  
 dst 
 . 
  CopierFrom 
 
 ( 
 src 
 ). 
 Run 
 ( 
 ctx 
 ); 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 return 
  
 fmt 
 . 
 Errorf 
 ( 
 "Object(%q).CopierFrom(%q).Run: %w" 
 , 
  
 dstName 
 , 
  
 object 
 , 
  
 err 
 ) 
  
 } 
  
 if 
  
 err 
  
 := 
  
 src 
 . 
 Delete 
 ( 
 ctx 
 ); 
  
 err 
  
 != 
  
 nil 
  
 { 
  
 return 
  
 fmt 
 . 
 Errorf 
 ( 
 "Object(%q).Delete: %w" 
 , 
  
 object 
 , 
  
 err 
 ) 
  
 } 
  
 fmt 
 . 
 Fprintf 
 ( 
 w 
 , 
  
 "Blob %v moved to %v.\n" 
 , 
  
 object 
 , 
  
 dstName 
 ) 
  
 return 
  
 nil 
 } 
 

Java

For more information, see the Cloud Storage Java API reference documentation .

To authenticate to Cloud Storage, set up Application Default Credentials. For more information, see Set up authentication for client libraries .

  import 
  
 com.google.cloud.storage. Blob 
 
 ; 
 import 
  
 com.google.cloud.storage. BlobId 
 
 ; 
 import 
  
 com.google.cloud.storage. BlobInfo 
 
 ; 
 import 
  
 com.google.cloud.storage. Storage 
 
 ; 
 import 
  
 com.google.cloud.storage. StorageOptions 
 
 ; 
 public 
  
 class 
 CopyDeleteObject 
  
 { 
  
 public 
  
 static 
  
 void 
  
 copyDeleteObject 
 ( 
  
 String 
  
 projectId 
 , 
  
 String 
  
 sourceBucketName 
 , 
  
 String 
  
 sourceObjectName 
 , 
  
 String 
  
 targetBucketName 
 , 
  
 String 
  
 targetObjectName 
 ) 
  
 { 
  
 // The ID of your GCP project 
  
 // String projectId = "your-project-id"; 
  
 // The ID of your GCS bucket 
  
 // String sourceBucketName = "your-unique-bucket-name"; 
  
 // The ID of your GCS object 
  
 // String sourceObjectName = "your-object-name"; 
  
 // The ID of the bucket to move the object objectName to 
  
 // String targetBucketName = "target-object-bucket" 
  
 // The ID of your GCS object 
  
 // String targetObjectName = "your-new-object-name"; 
  
  Storage 
 
  
 storage 
  
 = 
  
  StorageOptions 
 
 . 
 newBuilder 
 (). 
 setProjectId 
 ( 
 projectId 
 ). 
 build 
 (). 
  getService 
 
 (); 
  
  BlobId 
 
  
 source 
  
 = 
  
  BlobId 
 
 . 
 of 
 ( 
 sourceBucketName 
 , 
  
 sourceObjectName 
 ); 
  
  BlobId 
 
  
 target 
  
 = 
  
  BlobId 
 
 . 
 of 
 ( 
 targetBucketName 
 , 
  
 targetObjectName 
 ); 
  
 // Optional: set a generation-match precondition to avoid potential race 
  
 // conditions and data corruptions. The request returns a 412 error if the 
  
 // preconditions are not met. 
  
  Storage 
 
 . 
 BlobTargetOption 
  
 precondition 
 ; 
  
  BlobInfo 
 
  
 existingTarget 
  
 = 
  
 storage 
 . 
  get 
 
 ( 
 tar get 
BucketName 
 , 
  
 tar get 
ObjectName 
 ); 
  
 if 
  
 ( 
 existingTarget 
  
 == 
  
 null 
 ) 
  
 { 
  
 // For a target object that does not yet exist, set the DoesNotExist precondition. 
  
 // This will cause the request to fail if the object is created before the request runs. 
  
 precondition 
  
 = 
  
  Storage 
 
 . 
 BlobTargetOption 
 . 
 doesNotExist 
 (); 
  
 } 
  
 else 
  
 { 
  
 // If the destination already exists in your bucket, instead set a generation-match 
  
 // precondition. This will cause the request to fail if the existing object's generation 
  
 // changes before the request runs. 
  
 precondition 
  
 = 
  
  Storage 
 
 . 
 BlobTargetOption 
 . 
 generationMatch 
 ( 
 existingTarget 
 . 
  getGeneration 
 
 ()); 
  
 } 
  
 // Copy source object to target object 
  
 storage 
 . 
  copy 
 
 ( 
  
 Storage 
 . 
 CopyRequest 
 . 
 newBuilder 
 (). 
 setSource 
 ( 
 source 
 ). 
 setTarget 
 ( 
 target 
 , 
  
 precondition 
 ). 
 build 
 ()); 
  
  Blob 
 
  
 copiedObject 
  
 = 
  
 storage 
 . 
  get 
 
 ( 
 tar get 
 
 ); 
  
 // Delete the original blob now that we've copied to where we want it, finishing the "move" 
  
 // operation 
  
 storage 
 . 
  get 
 
 ( 
 source 
 ). 
 delete 
 (); 
  
 System 
 . 
 out 
 . 
 println 
 ( 
  
 "Moved object " 
  
 + 
  
 sourceObjectName 
  
 + 
  
 " from bucket " 
  
 + 
  
 sourceBucketName 
  
 + 
  
 " to " 
  
 + 
  
 targetObjectName 
  
 + 
  
 " in bucket " 
  
 + 
  
 copiedObject 
 . 
 getBucket 
 ()); 
  
 } 
 } 
 

Node.js

For more information, see the Cloud Storage Node.js API reference documentation .

To authenticate to Cloud Storage, set up Application Default Credentials. For more information, see Set up authentication for client libraries .

  /** 
 * TODO(developer): Uncomment the following lines before running the sample. 
 */ 
 // The ID of your GCS bucket 
 // const bucketName = 'your-source-bucket'; 
 // The ID of your GCS file 
 // const srcFileName = 'your-file-name'; 
 // The new ID for your GCS file 
 // const destFileName = 'your-new-file-name'; 
 // Imports the Google Cloud client library 
 const 
  
 { 
 Storage 
 } 
  
 = 
  
 require 
 ( 
 ' @google-cloud/storage 
' 
 ); 
 // Creates a client 
 const 
  
 storage 
  
 = 
  
 new 
  
 Storage 
 (); 
 async 
  
 function 
  
 moveFile 
 () 
  
 { 
  
 // Optional: 
  
 // Set a generation-match precondition to avoid potential race conditions 
  
 // and data corruptions. The request to copy is aborted if the object's 
  
 // generation number does not match your precondition. For a destination 
  
 // object that does not yet exist, set the ifGenerationMatch precondition to 0 
  
 // If the destination object already exists in your bucket, set instead a 
  
 // generation-match precondition using its generation number. 
  
 const 
  
 moveOptions 
  
 = 
  
 { 
  
 preconditionOpts 
 : 
  
 { 
  
 ifGenerationMatch 
 : 
  
 destinationGenerationMatchPrecondition 
 , 
  
 }, 
  
 }; 
  
 // Moves the file within the bucket 
  
 await 
  
 storage 
  
 . 
 bucket 
 ( 
 bucketName 
 ) 
  
 . 
 file 
 ( 
 srcFileName 
 ) 
  
 . 
  move 
 
 ( 
 destFileName 
 , 
  
 moveOptions 
 ); 
  
 console 
 . 
 log 
 ( 
  
 `gs:// 
 ${ 
 bucketName 
 } 
 / 
 ${ 
 srcFileName 
 } 
 moved to gs:// 
 ${ 
 bucketName 
 } 
 / 
 ${ 
 destFileName 
 } 
 ` 
  
 ); 
 } 
 moveFile 
 (). 
 catch 
 ( 
 console 
 . 
 error 
 ); 
 

PHP

For more information, see the Cloud Storage PHP API reference documentation .

To authenticate to Cloud Storage, set up Application Default Credentials. For more information, see Set up authentication for client libraries .

  use Google\Cloud\Storage\StorageClient; 
 /** 
 * Move an object to a new name and/or bucket. 
 * 
 * @param string $bucketName The name of your Cloud Storage bucket. 
 *        (e.g. 'my-bucket') 
 * @param string $objectName The name of your Cloud Storage object. 
 *        (e.g. 'my-object') 
 * @param string $newBucketName the destination bucket name. 
 *        (e.g. 'my-other-bucket') 
 * @param string $newObjectName the destination object name. 
 *        (e.g. 'my-other-object') 
 */ 
 function move_object(string $bucketName, string $objectName, string $newBucketName, string $newObjectName): void 
 { 
 $storage = new StorageClient(); 
 $bucket = $storage->bucket($bucketName); 
 $object = $bucket->object($objectName); 
 $object->copy($newBucketName, ['name' => $newObjectName]); 
 $object->delete(); 
 printf('Moved gs://%s/%s to gs://%s/%s' . PHP_EOL, 
 $bucketName, 
 $objectName, 
 $newBucketName, 
 $newObjectName); 
 } 
 

Python

For more information, see the Cloud Storage Python API reference documentation .

To authenticate to Cloud Storage, set up Application Default Credentials. For more information, see Set up authentication for client libraries .

  from 
  
 google.cloud 
  
 import 
  storage 
 
 def 
  
 move_blob 
 ( 
 bucket_name 
 , 
 blob_name 
 , 
 destination_bucket_name 
 , 
 destination_blob_name 
 ,): 
  
 """Moves a blob from one bucket to another with a new name.""" 
 # The ID of your GCS bucket 
 # bucket_name = "your-bucket-name" 
 # The ID of your GCS object 
 # blob_name = "your-object-name" 
 # The ID of the bucket to move the object to 
 # destination_bucket_name = "destination-bucket-name" 
 # The ID of your new GCS object (optional) 
 # destination_blob_name = "destination-object-name" 
 storage_client 
 = 
  storage 
 
 . 
  Client 
 
 () 
 source_bucket 
 = 
 storage_client 
 . 
  bucket 
 
 ( 
 bucket_name 
 ) 
 source_blob 
 = 
 source_bucket 
 . 
 blob 
 ( 
 blob_name 
 ) 
 destination_bucket 
 = 
 storage_client 
 . 
  bucket 
 
 ( 
 destination_bucket_name 
 ) 
 # Optional: set a generation-match precondition to avoid potential race conditions 
 # and data corruptions. The request is aborted if the object's 
 # generation number does not match your precondition. For a destination 
 # object that does not yet exist, set the if_generation_match precondition to 0. 
 # If the destination object already exists in your bucket, set instead a 
 # generation-match precondition using its generation number. 
 # There is also an `if_source_generation_match` parameter, which is not used in this example. 
 destination_generation_match_precondition 
 = 
 0 
 blob_copy 
 = 
 source_bucket 
 . 
  copy_blob 
 
 ( 
 source_blob 
 , 
 destination_bucket 
 , 
 destination_blob_name 
 , 
 if_generation_match 
 = 
 destination_generation_match_precondition 
 , 
 ) 
 source_bucket 
 . 
  delete_blob 
 
 ( 
 blob_name 
 ) 
 print 
 ( 
 "Blob 
 {} 
 in bucket 
 {} 
 moved to blob 
 {} 
 in bucket 
 {} 
 ." 
 . 
 format 
 ( 
 source_blob 
 . 
 name 
 , 
 source_bucket 
 . 
 name 
 , 
 blob_copy 
 . 
 name 
 , 
 destination_bucket 
 . 
 name 
 , 
 ) 
 ) 
 

Ruby

For more information, see the Cloud Storage Ruby API reference documentation .

To authenticate to Cloud Storage, set up Application Default Credentials. For more information, see Set up authentication for client libraries .

  def 
  
 move_file 
  
 bucket_name 
 :, 
  
 file_name 
 :, 
  
 new_name 
 : 
  
 # The ID of your GCS bucket 
  
 # bucket_name = "your-unique-bucket-name" 
  
 # The ID of your GCS object 
  
 # file_name = "your-file-name" 
  
 # The ID of your new GCS object 
  
 # new_name = "your-new-file-name" 
  
 require 
  
 "google/cloud/storage" 
  
 storage 
  
 = 
  
 Google 
 :: 
 Cloud 
 :: 
  Storage 
 
 . 
  new 
 
  
 bucket 
  
 = 
  
 storage 
 . 
 bucket 
  
 bucket_name 
 , 
  
 skip_lookup 
 : 
  
 true 
  
 file 
  
 = 
  
 bucket 
 . 
  file 
 
  
 file_name 
  
 renamed_file 
  
 = 
  
 file 
 . 
  copy 
 
  
 new_name 
  
 file 
 . 
 delete 
  
 puts 
  
 " 
 #{ 
 file_name 
 } 
 has been renamed to 
 #{ 
 renamed_file 
 . 
 name 
 } 
 " 
 end 
 

What's next

To search and filter code samples for other Google Cloud products, see the Google Cloud sample browser .

Create a Mobile Website
View Site in Mobile | Classic
Share by: