Comment renommer des fichiers et des dossiers dans Amazon S3?


210

Existe-t-il une fonction pour renommer des fichiers et des dossiers dans Amazon S3? Toutes les suggestions connexes sont également les bienvenues.

Réponses:


63

Il n'y a pas de méthode directe pour renommer un fichier dans S3. Ce que vous devez faire est de copier le fichier existant avec un nouveau nom (il suffit de définir la clé cible) et de supprimer l'ancien.


112
Donnez un exemple avec votre réponse, sinon faites un commentaire.
EternalHour

38
@EternalHour serait bien .. mais ce n'est pas nécessaire .. La question n'a même aucune indication sur la langue .. alors quel est l'intérêt de faire un exemple?
Lipis

50
C'est une mauvaise réponse. Vous pouvez déplacer des fichiers sur S3 en utilisant mv. mv = rename
Nicolo

17
C'est une mauvaise réponse pour deux raisons: 1) vous pouvez utiliser l'interface graphique pour faire un clic droit et renommer le fichier, et 2) comme cela a été mentionné avant de pouvoir déplacer le fichier avec la commande move ou via un sdk.
Maximus

11
Vous ne pouvez pas cliquer avec le bouton droit sur un nom de dossier pour le renommer sur S3.
area51

460

Je viens de tester cela et cela fonctionne:

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

10
Est-ce atomique? La deuxième commande (et la même) échouera-t-elle pendant l'exécution de la première?
Alex B

13
Aucun AWS n'a pas d'opération de déplacement atomique
AP.

1
Merci! Pourquoi avons-nous besoin --recursive?
Aziz Alto

2
@AzizAlto Dans le cas où il y a une structure de dossier plus profonde sous s3://<bucketname>/<folder_name_from>, ie s3://<bucketname>/<folder_name_from>/some/deeper/folders.
Ville

1
@JohnEikenberry Je ne peux pas croire que le mauvais commentaire de Raj ait 15 votes positifs. Il devrait être supprimé. Edit: Et il vient d'être supprimé. Agréable.
Doug S

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

6
Est cpsuivi de rmpréférable à mv?
Pyderman

12
Je préfère cp / rm à mv car vous pouvez vérifier si la copie a été effectuée avec succès avant de faire une suppression.
Thang Tran

2
Vous pouvez utiliser l'indicateur --dryrun pour vérifier la sortie de la commande sans l'exécuter réellement.
kmundnic


15

Vous pouvez utiliser l'AWS CLI ou la commande s3cmd pour renommer les fichiers et les dossiers du compartiment AWS S3.

À l'aide de S3cmd, utilisez la syntaxe suivante pour renommer un dossier,

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

À l'aide d'AWS CLI, utilisez la syntaxe suivante pour renommer un dossier,

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

1
Et si j'ai besoin de renommer tous les fichiers .csv. comment je fais?
LUZO

14

Je viens de faire fonctionner ça. Vous pouvez utiliser le kit AWS SDK pour PHP comme ceci:

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


Pour imiter complètement le changement de nom (par opposition à la copie puis à la suppression du dossier d'origine), avez-vous pu créer la source et cibler la même chose? Ou vous deviez les rendre différents, puis supprimer le dossier d'origine?
Pyderman

Je pense avoir fait une copie puis supprimer l'original. De mémoire, j'ai écrit cette réponse pour ma propre référence - la réponse acceptée dit la même chose, mais n'a pas donné l'exemple de code. D'un autre côté, je vous conseillerais de jeter un coup d'œil neuf aux documents AWS, car ils font constamment évoluer de nouvelles options.
Tom

Cet exemple montre «juste» la fonctionnalité de copie, plutôt que «déplacer» (ou «renommer»). Je sais qu'il a quelques années, mais avez-vous des chances de le mettre à jour avec la fonctionnalité complète? Notez que S3 créera l'objet «déplacé» comme un nouvel objet avec de nouveaux horodatages, etc. (iirc).
JamesBB

10

Nous avons 2 façons de renommer un fichier sur le stockage AWS S3 -

1. Utilisation de l'outil CLI -

aws s3 - mv récursif s3: // nom-bucket / dirname / oldfile s3: // bucket-name / dirname / newfile

2.Utilisation du SDK

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

8

Il n'y a aucun moyen de renommer un dossier via l'interface graphique, le moyen le plus rapide (et le plus simple si vous aimez l'interface graphique) pour y parvenir est d'effectuer une ancienne copie simple. Pour y parvenir: créez le nouveau dossier sur S3 à l'aide de l'interface graphique, accédez à votre ancien dossier, sélectionnez tout, marquez "copier" puis accédez au nouveau dossier et choisissez "coller". Une fois terminé, supprimez l'ancien dossier.

Cette méthode simple est très rapide car il s'agit de copies de S3 vers lui-même (pas besoin de les télécharger à nouveau ou quoi que ce soit du genre) et elle maintient également les autorisations et les métadonnées des objets copiés comme vous vous en doutez.


@Trisped Lors de mes tests il y a un instant, les fichiers peuvent être renommés à l'aide de l'interface graphique Web, mais pas les dossiers .
rinogo

7

Ceci est désormais possible pour les fichiers, sélectionnez le fichier puis sélectionnez Plus> Renommer dans l'interface graphique.

Pour renommer un dossier, vous devez à la place créer un nouveau dossier, sélectionner le contenu de l'ancien et le copier / coller (sous "Plus" à nouveau)


5

Voici comment vous le faites dans .NET, en utilisant S3 .NET SDK:

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

PS essayez d'utiliser des versions "Async" des méthodes clientes dans la mesure du possible, même si je ne l'ai pas fait pour la lisibilité


4

Cela fonctionne pour renommer le fichier dans le même dossier

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

1
Pas nécessairement dans le même dossier. La commande que vous avez fournie fonctionne comme un charme. Je vous remercie.
R.Cha

3

Voici l'exemple de code pour renommer un fichier sur s3. Mon fichier était partie-000 * en raison du fichier spark o / p, puis je le copie dans un autre nom de fichier au même emplacement et supprime la partie-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)

il suffit de noter que cela utilise python
f.khantsis

2

Dans la console AWS, si vous accédez à S3, vos dossiers seront répertoriés. Si vous accédez au dossier, vous verrez les objets répertoriés. clic droit et vous pouvez renommer. OU, vous pouvez cocher la case en face de votre objet, puis dans le menu déroulant nommé ACTIONS, vous pouvez sélectionner renommer. Je viens de travailler pour moi, 3-31-2019


"renommer" est grisé pour moi pour les dossiers, et Internet est plein de questions comme "pourquoi est renommé grisé pour les dossiers dans le navigateur S3?"
Steve

1

Comme l'a répondu Naaz, le renommage direct de s3 n'est pas possible.

j'ai joint un extrait de code qui copiera tout le contenu

le code fonctionne il suffit d'ajouter votre clé d'accès aws et votre clé secrète

voici ce que j'ai fait dans le code

-> copier le contenu du dossier source (enfant et dossiers imbriqués) et collé dans le dossier de destination

-> une fois la copie terminée, supprimez le dossier source

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
Veuillez envisager de modifier votre code car cette implémentation ne renvoie pas tout le contenu, comme vous l'avez laissé entendre, car lorsque vous appelez listObjects (bucketName, keyName), elle renvoie au plus 1000 éléments, vous devez appeler la méthode ObjectListing.isTruncated () pour savoir si une nouvelle demande est nécessaire. Considérez cela comme une référence docs.aws.amazon.com/AmazonS3/latest/dev/…
le0diaz

Cela fonctionne mais je suis également d'accord avec le commentaire ci-dessus. Remplacez simplement List <S3ObjectSummary> fileList = s3client.listObjects (bucketName, keyName) .getObjectSummaries (); avec 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 ()); }
Karthik

0

Le fichier et le dossier sont en fait des objets dans S3. Vous devez utiliser PUT OBJECT COPY pour les renommer. Voir http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html


1
alors que certaines langues n'ont pas de SDK offert par AWS, les grandes ( Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript) le font et il n'y a aucune raison de ne pas les utiliser aws.amazon.com/tools
Don Cheadle

3
Le SDK Java d'AWS est trop volumineux (et monolithique) pour les applications côté client.
Jesse Barnum

0

S3DirectoryInfo a une méthode MoveTo qui déplacera un répertoire dans un autre répertoire, de sorte que le répertoire déplacé deviendra un sous-répertoire de l'autre répertoire avec le même nom que celui qu'il avait à l'origine.

La méthode d'extension ci-dessous déplacera un répertoire vers un autre répertoire, c'est-à-dire que le répertoire déplacé deviendra l'autre répertoire. En fait, il crée le nouveau répertoire, y déplace tout le contenu de l'ancien répertoire, puis supprime l'ancien.

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

renommer tous les fichiers * .csv.err dans le répertoire en fichiers <<bucket>>/landing* .csv avec 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

Il existe un logiciel où vous pouvez jouer avec le seau s3 pour effectuer différents types d'opérations.

Nom du logiciel: Navigateur S3

Le navigateur S3 est un client Windows gratuit pour Amazon S3 et Amazon CloudFront. Amazon S3 fournit une interface de services Web simple qui peut être utilisée pour stocker et récupérer n'importe quelle quantité de données, à tout moment, de n'importe où sur le Web. Amazon CloudFront est un réseau de distribution de contenu (CDN). Il peut être utilisé pour livrer vos fichiers à l'aide d'un réseau mondial d'emplacements périphériques.


Si ce n'est qu'une seule fois, vous pouvez utiliser la ligne de commande pour effectuer ces opérations:

(1) Renommez le dossier dans le même compartiment:

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

(2) Renommez le seau:

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

Où,

{access_key} = Votre clé d'accès valide pour le client s3

{secret_key} = Votre clé scret valide pour le client s3

Cela fonctionne bien sans aucun problème.

Merci

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.