Come rinominare file e cartelle in Amazon S3?


210

Esiste una funzione per rinominare file e cartelle in Amazon S3? Eventuali suggerimenti correlati sono i benvenuti.

Risposte:


63

Non esiste un metodo diretto per rinominare un file in S3. Quello che devi fare è copiare il file esistente con un nuovo nome (basta impostare la chiave di destinazione) ed eliminare quello vecchio.


112
Fornisci un esempio con la tua risposta, altrimenti fai un commento.
EternalHour

38
@EternalHour sarebbe bello .. ma non è necessario .. La domanda non ha nemmeno alcuna indicazione sulla lingua .. quindi che senso ha fare un esempio?
Lipis,

50
Questa è una risposta sbagliata Puoi spostare i file su S3 usando mv. mv = rinomina
Nicolo

17
Questa è una risposta errata per due motivi: 1) è possibile utilizzare la GUI per fare clic con il pulsante destro del mouse e rinominare il file e 2) come è stato menzionato prima di poter spostare il file con il comando move o tramite un SDK.
Massimo

11
Non è possibile fare clic con il pulsante destro del mouse sul nome di una cartella per rinominarlo su S3.
area51

460

Ho appena provato questo e funziona:

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

10
È atomico? Il secondo (e lo stesso) comando fallirà mentre il primo è in esecuzione?
Alex B,

13
Nessun AWS non ha un'operazione di spostamento atomico
AP.

1
Grazie! Perché ne abbiamo bisogno --recursive?
Aziz Alto,

2
@AzizAlto Nel caso in cui sia presente una struttura di cartelle più profonda s3://<bucketname>/<folder_name_from>, ad es s3://<bucketname>/<folder_name_from>/some/deeper/folders.
Ville

1
@JohnEikenberry Non riesco a credere che il commento sbagliato di Raj abbia 15 voti. Dovrebbe essere cancellato. Modifica: ed è stato appena cancellato. Bello.
Doug S,

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

6
È cpseguito da rmpreferibile a mv?
Pyderman,

12
Preferisco cp / rm rispetto a mv dal momento che è possibile verificare se la copia è stata eseguita correttamente prima di effettuare qualsiasi eliminazione.
Thang Tran,

2
È possibile utilizzare il flag --dryrun per controllare l'output del comando senza eseguirlo effettivamente.
kmundnic


15

Puoi utilizzare l'interfaccia della riga di comando di AWS o il comando s3cmd per rinominare i file e le cartelle nel bucket AWS S3.

Utilizzando S3cmd, utilizzare la sintassi seguente per rinominare una cartella,

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

Utilizzando l'interfaccia della riga di comando di AWS, utilizzare la sintassi seguente per rinominare una cartella,

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

1
E se avessi bisogno di rinominare tutti i file .csv. come mai
LUZO,

14

Ho appena funzionato. Puoi utilizzare AWS SDK per PHP in questo modo:

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


Per imitare completamente la ridenominazione (invece di copiare e quindi eliminare la cartella originale), sei riuscito a rendere l'origine e la destinazione uguali? O hai dovuto renderli diversi, quindi eliminare la cartella originale?
Pyderman,

Penso di aver fatto una copia e quindi di eliminare l'originale. Dalla memoria ho scritto questa risposta per mio riferimento - la risposta accettata dice lo stesso, ma non ha fornito l'esempio di codice. D'altra parte, ti consiglierei di dare uno sguardo nuovo ai documenti AWS, perché stanno evolvendo continuamente nuove opzioni.
Tom,

Questo esempio "solo" mostra la funzionalità di copia, piuttosto che "sposta", (o "rinomina"). So che ha qualche anno, ma hai qualche possibilità di aggiornarlo con la funzionalità completa? Si noti che S3 creerà l'oggetto 'spostato' come nuovo oggetto con nuovi timestamp ecc (iirc).
JamesBB,

10

Abbiamo 2 modi per rinominare un file nell'archiviazione di AWS S3:

1.Utilizzando lo strumento CLI -

aws s3 --recursive mv s3: // bucket-name / dirname / oldfile s3: // bucket-name / dirname / newfile

2.Utilizzo di SDK

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

8

Non c'è modo di rinominare una cartella tramite la GUI, il modo più veloce (e più semplice se ti piace la GUI) per raggiungere questo obiettivo è quello di eseguire una vecchia copia semplice. Per ottenere ciò: crea la nuova cartella su S3 usando la GUI, vai alla tua vecchia cartella, seleziona tutto, segna "copia" e poi vai alla nuova cartella e scegli "incolla". Al termine, rimuovere la vecchia cartella.

Questo semplice metodo è molto veloce perché è una copia da S3 a se stesso (non è necessario ricaricarlo o qualcosa del genere) e mantiene anche le autorizzazioni e i metadati degli oggetti copiati come ci si aspetterebbe.


@Trisped Nei miei test appena un momento fa, i file possono essere rinominati utilizzando la GUI Web, ma non le cartelle .
Rinogo,

7

Questo è ora possibile per File, selezionare il file quindi selezionare Altro> Rinomina nella GUI.

Per rinominare una cartella, devi invece creare una nuova cartella e selezionare il contenuto di quello vecchio e copiarlo / incollarlo (di nuovo in "Altro")


5

Ecco come lo fai in .NET, usando S3 .NET SDK:

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

PS prova a usare le versioni "Async" dei metodi client ove possibile, anche se non l'ho fatto per leggibilità


4

Funziona per rinominare il file nella stessa cartella

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

1
Non necessariamente nella stessa cartella. Il comando che hai fornito funziona come un incantesimo. Grazie.
R.Cha

3

Di seguito è riportato l'esempio di codice per rinominare il file su s3. Il mio file era parte 000 * a causa del file spark o / p, quindi lo copio in un altro nome file nella stessa posizione ed elimino la parte 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)

basta notare che questo sta usando python
f.khantsis il

2

Nella console AWS, se passi a S3, vedrai le tue cartelle elencate. Se navighi nella cartella, vedrai gli oggetti elencati. tasto destro del mouse e puoi rinominare. OPPURE, puoi selezionare la casella davanti al tuo oggetto, quindi dal menu a discesa denominato AZIONI, puoi selezionare rinomina. Ho appena lavorato per me, 3-31-2019


"Rinomina" è disattivato per me per le cartelle e Internet è pieno di domande come "perché rinominare è disattivato per le cartelle nel browser S3?"
Steve

1

Come ha risposto Naaz, non è possibile rinominare direttamente s3.

ho allegato uno snippet di codice che copierà tutti i contenuti

il codice funziona, basta aggiungere la chiave di accesso aws e la chiave segreta

ecco cosa ho fatto nel codice

-> copia il contenuto della cartella di origine (figlio e cartelle nidificati) e incollato nella cartella di destinazione

-> al termine della copia, eliminare la cartella di origine

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
Ti preghiamo di considerare di modificare il tuo codice poiché questa implementazione non restituisce tutto il contenuto, come hai implicato, perché quando chiami listObjects (bucketName, keyName), restituisce al massimo 1000 elementi, dovresti chiamare il metodo ObjectListing.isTruncated () per sapere se è necessaria una nuova chiamata di richiesta. Considera questo come riferimento docs.aws.amazon.com/AmazonS3/latest/dev/…
le0diaz

Funziona ma concordo anche con il commento sopra. Sostituisci semplicemente List <S3ObjectSummary> fileList = s3client.listObjects (bucketName, keyName) .getObjectSummaries (); con ObjectListing objectListing = s3.listObjects (bucketName, keyName); Elenco <S3ObjectSummary> fileList = new ArrayList <> (); fileList.addAll (objectListing.getObjectSummaries ()); while (objectListing.isTruncated ()) {objectListing = s3.listNextBatchOfObjects (objectListing); fileList.addAll (objectListing.getObjectSummaries ()); }
Karthik,

0

Il file e la cartella sono in realtà oggetti in S3. Dovresti usare PUT OBJECT COPY per rinominarli. Vedi http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html


1
mentre alcune lingue non hanno un SDK offerto da AWS, quelle grandi ( Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript) lo fanno e non c'è motivo di non usarle aws.amazon.com/tools
Don Cheadle

3
Java SDK di AWS è troppo grande (e monolitico) per le applicazioni lato client.
Jesse Barnum,

0

S3DirectoryInfo ha un metodo MoveTo che sposta una directory in un'altra directory, in modo tale che la directory spostata diventerà una sottodirectory dell'altra directory con lo stesso nome che aveva originariamente.

Il metodo di estensione seguente sposta una directory in un'altra directory, ovvero la directory spostata diventa l'altra directory. Ciò che effettivamente fa è creare la nuova directory, spostare in essa tutto il contenuto della vecchia directory, quindi eliminare quella vecchia.

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

rinominare tutti i file * .csv.err nella directory in file <<bucket>>/landing* .csv con 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

Esiste un software in cui è possibile giocare con il bucket S3 per eseguire diversi tipi di operazioni.

Nome del Software: S3 Browser

S3 Browser è un client Windows freeware per Amazon S3 e Amazon CloudFront. Amazon S3 offre una semplice interfaccia di servizi Web che può essere utilizzata per archiviare e recuperare qualsiasi quantità di dati, in qualsiasi momento, da qualsiasi parte del Web. Amazon CloudFront è una rete di distribuzione di contenuti (CDN). Può essere usato per consegnare i tuoi file usando una rete globale di posizioni perimetrali.


Se è solo una volta, è possibile utilizzare la riga di comando per eseguire queste operazioni:

(1) Rinomina la cartella nello stesso bucket:

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

(2) Rinomina il bucket:

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

Dove,

{access_key} = La tua chiave di accesso valida per il client s3

{secret_key} = La tua chiave scret valida per il client s3

Funziona bene senza alcun problema.

Grazie

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.