Як перейменувати файли та папки в Amazon S3?


207

Чи є якась функція перейменувати файли та папки в Amazon S3? Будь-які пов'язані пропозиції також вітаються.

Відповіді:


62

Немає прямого методу перейменування файлу в S3. Вам потрібно скопіювати існуючий файл з новим іменем (просто встановіть цільову клавішу) та видаліть старий.


112
Наведіть приклад зі своєю відповіддю, інакше зробіть коментар.
EternalHour

38
@EternalHour було б добре ... але це не обов'язково .. У питанні навіть немає вказівки про мову .. тож який сенс робити приклад?
Ліпіс

49
Це неправильна відповідь. Ви можете переміщувати файли на S3, використовуючи mv. mv = перейменувати
Ніколо

17
Це неправильна відповідь з двох причин: 1) ви можете використовувати графічний інтерфейс, щоб натиснути правою кнопкою миші та перейменувати файл, і 2) як це було зазначено, перш ніж ви зможете перемістити файл за допомогою команди переміщення або через sdk.
Максим

11
Ви не можете натиснути правою кнопкою миші на ім'я папки, щоб перейменувати її на S3.
область51

459

Я щойно це перевірив, і це працює:

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

10
Це атомний? Невдала буде друга (і та сама) команда під час виконання першої?
Алекс Б

13
Жодна AWS не має операції переміщення атома
AP.

1
Дякую! Навіщо нам це потрібно --recursive?
Азіз Альто

2
@AzizAlto У випадку, якщо є глибша структура папки під s3://<bucketname>/<folder_name_from>, тобто s3://<bucketname>/<folder_name_from>/some/deeper/folders.
Віль

1
@JohnEikenberry Я не можу повірити, що неправильний коментар Раджа має 15 відгуків. Його слід видалити. Редагувати: І його тільки зараз видалили. Приємно.
Doug S

31
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, щоб перевірити вихід команди, фактично не виконуючи її.
kmundnic


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>

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

У нас є два способи перейменування файлу на сховищі 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}",));

8

Немає можливості перейменувати папку через GUI, найшвидший (і найпростіший, якщо вам подобається GUI) спосіб досягти цього - це виконати звичайну стару копію. Щоб досягти цього: створіть нову папку на S3 за допомогою GUI, перейдіть до вашої старої папки, виберіть усе, позначте «копіювати» та перейдіть до нової папки та виберіть «вставити». Після закінчення видаліть стару папку.

Цей простий метод дуже швидкий, оскільки це копії з S3 до себе (не потрібно повторно завантажувати чи щось подібне), а також підтримує дозволи та метадані скопійованих об'єктів, як ви очікували.


@Trisped У моєму тестуванні мить, файли можуть бути перейменовані за допомогою веб-інтерфейсу, але не папки .
rinogo

7

Тепер це можливо для файлів, виберіть файл, а потім виберіть Більше> Перейменувати в графічному інтерфейсі.

Щоб перейменувати папку, замість цього потрібно створити нову папку та вибрати вміст старої та скопіювати / вставити її (знову в розділі "Докладніше")


5

Ось як ви це робите в .NET, використовуючи S3 .NET SDK:

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

PS намагаються використовувати версії "Async" версій клієнтських методів, де це можливо, хоча я цього не робив для читабельності


4

Це працює для перейменування файла в одній папці

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

1
Не обов’язково в одній папці. Команда, яку ви надали, працює як шарм. Дякую.
Р.Ча

3

Нижче наведено приклад коду для перейменування файлу на s3. Мій файл був частиною-000 * через іскровий файл p / p, потім я копіюю його до іншого імені файлу з того самого місця та видаляю частину-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, ви побачите свої папки в списку. Якщо ви перейдете до папки, ви побачите перелічені об’єкти. клацніть правою кнопкою миші, і ви можете перейменувати. АБО ви можете встановити прапорець перед вашим об'єктом, тоді з випадаючого меню під назвою ДІЇ можна вибрати перейменувати. Просто працював для мене, 3-31-2019


"Перейменувати" для мене папок для сірих папок, а в Інтернеті багато запитань на кшталт "чому перейменувати сірим кольором для папок у браузері S3?"
Стів

1

Як відповів Naaz, пряме перейменування s3 неможливо.

я додав фрагмент коду, який буде копіювати весь вміст

код працює просто додайте ключ доступу та секретний ключ

ось що я зробив у коді

-> скопіюйте вміст вихідної папки (вкладені дочірні та папки) та вставте в цільову папку

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

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

Це працює, але я також згоден з коментарем вище. Просто замініть Список <S3ObjectSummary> fileList = s3client.listObjects (bucketName, keyName) .getObjectSummaries (); з ObjectListing objectListing = s3.listObjects (bucketName, keyName); Список <S3ObjectSummary> fileList = новий 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


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;
    }
}

0

перейменуйте всі файли * .csv.err у <<bucket>>/landingdir у * .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

Браузер 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/

Де,

{access_key} = Ваш дійсний ключ доступу для клієнта s3

{secret_key} = Ваш дійсний ключ scret для клієнта s3

Це працює нормально без проблем.

Дякую

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.