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

210

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

Shan
источник

Ответы:

63

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

Нааз Мухаммед
источник
112
Приведите пример с вашим ответом, в противном случае оставьте комментарий.
EternalHour
38
@EternalHour было бы неплохо ... но это не обязательно ... Вопрос даже не имеет никакого отношения к языку ... так какой смысл делать пример?
Липис
50
Это неправильный ответ. Вы можете перемещать файлы на S3, используя mv. mv = переименовать
Николо
17
Это неправильный ответ по двум причинам: 1) вы можете использовать графический интерфейс, чтобы щелкнуть правой кнопкой мыши и переименовать файл, и 2) как уже упоминалось, прежде чем вы можете перемещать файл с помощью команды перемещения или с помощью SDK.
Максимус
11
Вы не можете щелкнуть правой кнопкой мыши имя папки, чтобы переименовать ее на S3.
area51
460

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

aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
bennythejudge
источник
10
Это атомно? Сбой второй (и той же) команды при выполнении первой?
Алекс Б
13
Ни в АМС нет операции атомарного перемещения
AP.
1
Спасибо! Зачем нам это нужно --recursive?
Азиз Альто
2
@AzizAlto В случае , если существует более глубокая структура папок под s3://<bucketname>/<folder_name_from>, то есть s3://<bucketname>/<folder_name_from>/some/deeper/folders.
Вилле
1
@JohnEikenberry Я не могу поверить, что неправильный комментарий Радж имеет 15 голосов. Это должно быть удалено. Изменить: И это было только что удалено. Ницца.
Даг С
32
aws s3 cp s3://source_folder/ s3://destination_folder/ --recursive
aws s3 rm s3://source_folder --recursive
Тханг Чан
источник
6
Является ли cpзатем rmпредпочтительнее mv?
Пидерман
12
Я предпочитаю cp / rm, а не mv, так как вы можете проверить, была ли копия сделана успешно, прежде чем делать какое-либо удаление.
Тханг Чан
2
Вы можете использовать флаг --dryrun, чтобы проверить вывод команды, фактически не выполняя ее.
кмундник
15

Вы можете использовать AWS CLI или команду s3cmd, чтобы переименовать файлы и папки в корзине AWS S3.

Используя 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>
Basheer.O
источник
1
Что делать, если мне нужно переименовать все файлы .csv. как получилось?
LUZO
14

Я только что получил это работает. Вы можете использовать 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 создаст «перемещенный» объект как новый объект с новыми временными метками и т. Д. (Iirc).
JamesBB,
10

У нас есть 2 способа переименовать файл в хранилище AWS S3:

1. Используя инструмент CLI -

aws s3 - рекурсивный mv s3: // имя сегмента / dirname / oldfile s3: // имя сегмента / dirname / newfile

2. Использование SDK

$s3->copyObject(array(
'Bucket'     => $targetBucket,
'Key'        => $targetKeyname,
'CopySource' => "{$sourceBucket}/{$sourceKeyname}",));
P_O_I_S_O_N
источник
8

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

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

orcaman
источник
@Trisped В моем тестировании только что, файлы могут быть переименованы с помощью веб-интерфейса, но не папок .
риного
7

Теперь это возможно для Файлов, выберите файл, затем выберите Дополнительно> Переименовать в графическом интерфейсе.

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

Jethro
источник
5

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

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

PS старайтесь использовать «асинхронные» версии клиентских методов, где это возможно, хотя я не сделал этого для удобства чтения

Alex
источник
4

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

aws s3  mv s3://bucketname/folder_name1/test_original.csv s3://bucket/folder_name1/test_renamed.csv
Техническая поддержка
источник
1
Не обязательно в той же папке. Команда, которую вы предоставили, работает как шарм. Спасибо.
R.Cha
3

Ниже приведен пример кода для переименования файла на s3. Мой файл был part-000 * из-за файла spark o / p, затем я скопировал его в другое имя файла в том же месте и удалил part-000 *:

import boto3
client = boto3.client('s3')
response = client.list_objects(
Bucket='lsph',
MaxKeys=10,
Prefix='03curated/DIM_DEMOGRAPHIC/',
Delimiter='/'
)
name = response["Contents"][0]["Key"]
copy_source = {'Bucket': 'lsph', 'Key': name}
client.copy_object(Bucket='lsph', CopySource=copy_source, 
Key='03curated/DIM_DEMOGRAPHIC/'+'DIM_DEMOGRAPHIC.json')
client.delete_object(Bucket='lsph', Key=name)
Викас
источник
просто обратите внимание, что это использует python
f.khantsis
2

В консоли AWS, если вы перейдете к S3, вы увидите свои папки в списке. Если вы перейдете к папке, вы увидите объект (ы) в списке. щелкните правой кнопкой мыши, и вы можете переименовать. ИЛИ, вы можете поставить галочку напротив вашего объекта, затем из выпадающего меню с именем ACTIONS вы можете выбрать переименовать. Просто работал для меня, 3-31-2019

1082E1984
источник
«Переименовать» для меня выделено серым цветом для папок, а в Интернете полно вопросов, таких как «Почему переименовано для папок в браузере S3?»
Стив
1

Как ответил Нааз, прямое переименование 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;
}

}

Матин
источник
2
Пожалуйста, рассмотрите возможность редактирования вашего кода, так как эта реализация не возвращает весь контент, как вы подразумевали, потому что когда вы вызываете listObjects (bucketName, keyName), он возвращает не более 1000 элементов, вы должны вызвать метод ObjectListing.isTruncated (), чтобы знать если новый запрос вызова необходим. Рассмотрим это в качестве ссылки docs.aws.amazon.com/AmazonS3/latest/dev/...
le0diaz
Это работает, но я также согласен с комментарием выше. Просто замените List <S3ObjectSummary> fileList = s3client.listObjects (bucketName, keyName) .getObjectSummaries (); с ObjectListing objectListing = s3.listObjects (bucketName, keyName); List <S3ObjectSummary> fileList = new ArrayList <> (); fileList.addAll (objectListing.getObjectSummaries ()); while (objectListing.isTruncated ()) {objectListing = s3.listNextBatchOfObjects (objectListing); fileList.addAll (objectListing.getObjectSummaries ()); }
Картик
0

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

Okwap
источник
1
в то время как некоторые языки не имеют SDK, предлагаемого AWS, у больших ( Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript) есть, и нет никаких причин не использовать их aws.amazon.com/tools
Дон Чидл
3
Java SDK от AWS слишком велик (и монолитен) для клиентских приложений.
Джесси Барнум
0

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;
    }
}
Hansa
источник
0

переименуйте все файлы * .csv.err в директории в файлы <<bucket>>/landing* .csv с помощью s3cmd

 export aws_profile='foo-bar-aws-profile'
 while read -r f ; do tgt_fle=$(echo $f|perl -ne 's/^(.*).csv.err/$1.csv/g;print'); \
        echo s3cmd -c ~/.aws/s3cmd/$aws_profile.s3cfg mv $f $tgt_fle; \
 done < <(s3cmd -r -c ~/.aws/s3cmd/$aws_profile.s3cfg ls --acl-public --guess-mime-type \
        s3://$bucket | grep -i landing | grep csv.err | cut -d" " -f5)
Йордан Георгиев
источник
-2

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

Название программного обеспечения: S3 Browser

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


Если это только один раз, то вы можете использовать командную строку для выполнения этих операций:

(1) Переименуйте папку в том же ведре:

s3cmd --access_key={access_key} --secret_key={secret_key} mv s3://bucket/folder1/* s3://bucket/folder2/

(2) переименовать ведро:

s3cmd --access_key={access_key} --secret_key={secret_key} mv s3://bucket1/folder/* s3://bucket2/folder/

Куда,

{ключ доступа} = Ваш действительный ключ доступа для клиента s3

{Секретный ключ} = Ваш действительный ключ скретта для клиента s3

Работает нормально без проблем.

Спасибо

Рададия Никунь
источник