Как переименовать файлы и папки в Amazon S3?

есть ли функция переименования файлов и папок в Amazon S3? Любые предложения также приветствуются.

13 ответов


нет прямого метода переименования файла в s3. что вам нужно сделать, это скопировать существующий файл с новым именем (просто набор целевой ключ) и удалить старую.


Я только что протестировал это, и это работает:

aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>

можно использовать команды AWS CLI to mv файлы


Я только что получил это работает. Вы можете использовать AWS SDK для PHP следующим образом:

use Aws\S3\S3Client;

$sourceBucket = '*** Your Source Bucket Name ***';
$sourceKeyname = '*** Your Source Object Key ***';
$targetBucket = '*** Your Target Bucket Name ***';
$targetKeyname = '*** Your Target Key Name ***';        

// Instantiate the client.
$s3 = S3Client::factory();

// Copy an object.
$s3->copyObject(array(
    'Bucket'     => $targetBucket,
    'Key'        => $targetKeyname,
    'CopySource' => "{$sourceBucket}/{$sourceKeyname}",
));

http://docs.aws.amazon.com/AmazonS3/latest/dev/CopyingObjectUsingPHP.html


aws s3 cp s3://source_folder/ s3://destination_folder/ --recursive
aws s3 rm s3://source_folder --recursive

для переименования файлов и папок в AWS S3 bucket можно использовать команду AWS CLI или s3cmd.

используя S3cmd, используйте следующий синтаксис для переименования папки,

s3cmd --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>

используя AWS CLI, используйте следующий синтаксис для переименования папки,

aws s3 --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>

нет способа переименовать папку через GUI, самый быстрый (и простой, если вам нравится GUI) способ достичь этого-выполнить обычную старую копию. Чтобы достичь этого: создайте новую папку на S3 с помощью GUI, перейдите в свою старую папку, выберите все, отметьте "копировать", а затем перейдите в новую папку и выберите"Вставить". Когда закончите, удалите старую папку.

этот простой метод очень быстрый, потому что он копирует с S3 на себя (не нужно повторно загружать или что-то в этом роде), и он также поддерживает разрешения и метаданные скопированных объектов, как и следовало ожидать.


теперь это возможно для файлов, выберите Файл, затем выберите больше > переименовать в GUI.

чтобы переименовать папку, Вам вместо этого нужно создать новую папку и выбрать содержимое старой и скопировать / вставить ее (в разделе " Еще " снова)


вот как вы это делаете в .NET, используя S3 .NET SDK:

var client = new Amazon.S3.AmazonS3Client(_credentials, _config);
client.CopyObject(oldBucketName, oldfilepath, newBucketName, newFilePath);
client.DeleteObject(oldBucketName, oldfilepath);

П. С. Попробуйте использовать "асинхронный" версий клиентские методы, где это возможно, хотя я не делал так для читабельности


это работает для переименования файла в той же папке

aws s3  mv s3://bucketname/folder_name1/test_original.csv s3://bucket/folder_name1/test_renamed.csv

файл и папка фактически являются объектами в S3. Вы должны использовать put OBJECT COPY для их переименования. См.http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html


как ответил Naaz, прямое переименование s3 невозможно.

я прикрепил фрагмент кода, который скопирует все содержимое

код работает просто добавьте ключ доступа aws и секретный ключ

вот что я сделал в коде

- > скопируйте содержимое исходной папки (вложенные дочерние и папки) и вставьте в папку назначения

-> по завершении копирования удалите исходную папку

package com.bighalf.doc.amazon;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.List;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.CopyObjectRequest;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.model.S3ObjectSummary;

public class Test {

public static boolean renameAwsFolder(String bucketName,String keyName,String newName) {
    boolean result = false;
    try {
        AmazonS3 s3client = getAmazonS3ClientObject();
        List<S3ObjectSummary> fileList = s3client.listObjects(bucketName, keyName).getObjectSummaries();
        //some meta data to create empty folders start
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentLength(0);
        InputStream emptyContent = new ByteArrayInputStream(new byte[0]);
        //some meta data to create empty folders end

        //final location is the locaiton where the child folder contents of the existing folder should go
        String finalLocation = keyName.substring(0,keyName.lastIndexOf('/')+1)+newName;
        for (S3ObjectSummary file : fileList) {
            String key = file.getKey();
            //updating child folder location with the newlocation
            String destinationKeyName = key.replace(keyName,finalLocation);
            if(key.charAt(key.length()-1)=='/'){
                //if name ends with suffix (/) means its a folders
                PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, destinationKeyName, emptyContent, metadata);
                s3client.putObject(putObjectRequest);
            }else{
                //if name doesnot ends with suffix (/) means its a file
                CopyObjectRequest copyObjRequest = new CopyObjectRequest(bucketName, 
                        file.getKey(), bucketName, destinationKeyName);
                s3client.copyObject(copyObjRequest);
            }
        }
        boolean isFodlerDeleted = deleteFolderFromAws(bucketName, keyName);
        return isFodlerDeleted;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

public static boolean deleteFolderFromAws(String bucketName, String keyName) {
    boolean result = false;
    try {
        AmazonS3 s3client = getAmazonS3ClientObject();
        //deleting folder children
        List<S3ObjectSummary> fileList = s3client.listObjects(bucketName, keyName).getObjectSummaries();
        for (S3ObjectSummary file : fileList) {
            s3client.deleteObject(bucketName, file.getKey());
        }
        //deleting actual passed folder
        s3client.deleteObject(bucketName, keyName);
        result = true;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

public static void main(String[] args) {
    intializeAmazonObjects();
    boolean result = renameAwsFolder(bucketName, keyName, newName);
    System.out.println(result);
}

private static AWSCredentials credentials = null;
private static AmazonS3 amazonS3Client = null;
private static final String ACCESS_KEY = "";
private static final String SECRET_ACCESS_KEY = "";
private static final String bucketName = "";
private static final String keyName = "";
//renaming folder c to x from key name
private static final String newName = "";

public static void intializeAmazonObjects() {
    credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_ACCESS_KEY);
    amazonS3Client = new AmazonS3Client(credentials);
}

public static AmazonS3 getAmazonS3ClientObject() {
    return amazonS3Client;
}

}


S3DirectoryInfo имеет MoveTo метод, который будет перемещать один каталог на другой каталог, такой, что перемещенный каталог станет подкаталогом другого каталога с тем же именем, что и изначально.

метод расширения ниже переместит один каталог в другой каталог, т. е. перемещенный каталог станет другим каталогом. На самом деле он создает новый каталог, перемещает все содержимое старого каталога в него, а затем удалить старую.

public static class S3DirectoryInfoExtensions
{
    public static S3DirectoryInfo Move(this S3DirectoryInfo fromDir, S3DirectoryInfo toDir)
    {
        if (toDir.Exists)
            throw new ArgumentException("Destination for Rename operation already exists", "toDir");
        toDir.Create();
        foreach (var d in fromDir.EnumerateDirectories())
            d.MoveTo(toDir);
        foreach (var f in fromDir.EnumerateFiles())
            f.MoveTo(toDir);
        fromDir.Delete();
        return toDir;
    }
}