Wie benenne ich Dateien und Ordner in Amazon S3 um?

207

Gibt es eine Funktion zum Umbenennen von Dateien und Ordnern in Amazon S3? Alle entsprechenden Vorschläge sind ebenfalls willkommen.

Shan
quelle

Antworten:

62

Es gibt keine direkte Methode zum Umbenennen einer Datei in S3. Sie müssen lediglich die vorhandene Datei mit einem neuen Namen kopieren (einfach den Zielschlüssel festlegen) und den alten löschen.

Naaz Muhammadh
quelle
111
Geben Sie ein Beispiel mit Ihrer Antwort, andernfalls machen Sie einen Kommentar.
Ewige Stunde
38
@EternalHour wäre nett .. aber es ist nicht notwendig .. Die Frage hat nicht einmal einen Hinweis auf die Sprache .. also was bringt es, ein Beispiel zu machen?
Lipis
49
Das ist eine falsche Antwort. Sie können Dateien in S3 mit mv verschieben. mv = umbenennen
Nicolo
17
Dies ist aus zwei Gründen eine falsche Antwort: 1) Sie können die GUI verwenden, um mit der rechten Maustaste zu klicken und die Datei umzubenennen, und 2) wie bereits erwähnt, bevor Sie die Datei mit dem Befehl move oder über ein SDK verschieben können.
Maximus
11
Sie können nicht mit der rechten Maustaste auf einen Ordnernamen klicken, um ihn in S3 umzubenennen.
area51
458

Ich habe das gerade getestet und es funktioniert:

aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
bennythejudge
quelle
10
Ist es atomar? Wird der zweite (und der gleiche) Befehl fehlschlagen, während der erste ausgeführt wird?
Alex B
13
Nein, AWS hat keine atomare Verschiebungsoperation
AP.
1
Vielen Dank! Warum brauchen wir --recursive?
Aziz Alto
2
@AzizAlto Falls es eine tiefere Ordnerstruktur unter gibt s3://<bucketname>/<folder_name_from>, dh s3://<bucketname>/<folder_name_from>/some/deeper/folders.
Ville
1
@ JohnEikenberry Ich kann nicht glauben, dass Rajs falscher Kommentar 15 positive Stimmen hat. Es sollte gelöscht werden. Edit: Und es wurde gerade gelöscht. Nett.
Doug S
30
aws s3 cp s3://source_folder/ s3://destination_folder/ --recursive
aws s3 rm s3://source_folder --recursive
Thang Tran
quelle
6
Wird cpgefolgt von rmvorzuziehen mv?
Pyderman
11
Ich bevorzuge cp / rm gegenüber mv, da Sie überprüfen können, ob die Kopie erfolgreich erstellt wurde, bevor Sie sie löschen.
Thang Tran
1
Mit dem Flag --dryrun können Sie die Ausgabe des Befehls überprüfen, ohne ihn tatsächlich auszuführen.
kmundnic
26

Sie können die AWS CLI-Befehle für mvdie Dateien verwenden

Cavaz
quelle
15

Sie können entweder die AWS CLI oder den Befehl s3cmd verwenden, um die Dateien und Ordner im AWS S3-Bucket umzubenennen.

Verwenden Sie mit S3cmd die folgende Syntax, um einen Ordner umzubenennen:

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

Verwenden Sie mithilfe der AWS CLI die folgende Syntax, um einen Ordner umzubenennen:

aws s3 --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
Basheer.O
quelle
1
Was ist, wenn ich alle CSV-Dateien umbenennen muss. wie kommt es mir
LUZO
14

Ich habe gerade das funktioniert. Sie können das AWS SDK für PHP folgendermaßen verwenden:

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

Tom
quelle
Konnten Sie die Quelle und das Ziel gleich festlegen, um das Umbenennen vollständig nachzuahmen (im Gegensatz zum Kopieren und anschließenden Löschen des ursprünglichen Ordners)? Oder mussten Sie sie anders machen und dann den ursprünglichen Ordner löschen?
Pyderman
Ich glaube, ich habe eine Kopie gemacht und dann das Original gelöscht. Aus dem Gedächtnis habe ich diese Antwort als Referenz geschrieben - die akzeptierte Antwort sagt dasselbe, gab aber kein Codebeispiel. Auf der anderen Seite würde ich Ihnen raten, die AWS-Dokumente neu zu betrachten, da sie ständig neue Optionen entwickeln.
Tom
Dieses Beispiel "nur" zeigt die Kopierfunktion und nicht "verschieben" (oder "umbenennen"). Ich weiß, dass es ein paar Jahre alt ist, aber gibt es eine Chance, dass Sie es mit der vollständigen Funktionalität aktualisieren können? Beachten Sie, dass S3 das 'verschobene' Objekt als neues Objekt mit neuen Zeitstempeln usw. (iirc) erstellt.
JamesBB
10

Wir haben zwei Möglichkeiten, eine Datei im AWS S3-Speicher umzubenennen:

1. Verwenden des CLI-Tools -

aws s3 --recursive mv s3: // Bucket-Name / Verzeichnisname / alte Datei s3: // Bucket-Name / Verzeichnisname / neue Datei

2. SDK verwenden

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

Es gibt keine Möglichkeit, einen Ordner über die GUI umzubenennen. Der schnellste (und einfachste, wenn Sie die GUI mögen) Weg, dies zu erreichen, besteht darin, eine einfache alte Kopie durchzuführen. Um dies zu erreichen: Erstellen Sie den neuen Ordner in S3 über die GUI, wechseln Sie zu Ihrem alten Ordner, wählen Sie alle aus, markieren Sie "Kopieren", navigieren Sie zum neuen Ordner und wählen Sie "Einfügen". Wenn Sie fertig sind, entfernen Sie den alten Ordner.

Diese einfache Methode ist sehr schnell, da es sich um Kopien von S3 in sich selbst handelt (kein erneutes Hochladen oder ähnliches erforderlich) und die Berechtigungen und Metadaten der kopierten Objekte wie erwartet beibehalten werden.

Orkaman
quelle
@Trisped Bei meinen Tests vor kurzem wurden Dateien möglicherweise über die Web-GUI umbenannt, jedoch nicht über Ordner .
Rinogo
7

Dies ist jetzt für Dateien möglich. Wählen Sie die Datei aus und wählen Sie dann Mehr> Umbenennen in der GUI.

Um einen Ordner umzubenennen, müssen Sie stattdessen einen neuen Ordner erstellen, den Inhalt des alten auswählen und ihn kopieren / einfügen (erneut unter "Mehr").

Jethro
quelle
5

So machen Sie es in .NET mit S3 .NET SDK:

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

PS versuchen, nach Möglichkeit "Async" -Versionen der Client-Methoden zu verwenden, obwohl ich dies aus Gründen der Lesbarkeit nicht getan habe

Alex
quelle
4

Dies funktioniert zum Umbenennen der Datei im selben Ordner

aws s3  mv s3://bucketname/folder_name1/test_original.csv s3://bucket/folder_name1/test_renamed.csv
Technischer Support
quelle
1
Nicht unbedingt im selben Ordner. Der von Ihnen angegebene Befehl funktioniert wie ein Zauber. Danke dir.
R.Cha
3

Unten finden Sie das Codebeispiel zum Umbenennen der Datei in s3. Meine Datei war Teil-000 * wegen der Spark-O / P-Datei, dann kopiere ich sie in einen anderen Dateinamen am selben Speicherort und lösche den Teil-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)
Vikas
quelle
Beachten Sie nur, dass dies Python verwendet
f.khantsis
2

Wenn Sie in der AWS-Konsole zu S3 navigieren, werden Ihre Ordner aufgelistet. Wenn Sie zu dem Ordner navigieren, werden die Objekte aufgelistet. Rechtsklick und Sie können umbenennen. ODER Sie können das Kontrollkästchen vor Ihrem Objekt aktivieren und dann im Pulldown-Menü mit dem Namen ACTIONS die Option Umbenennen auswählen. Ich habe gerade für mich gearbeitet, 31.03.2019

1082E1984
quelle
"Umbenennen" ist für mich für Ordner ausgegraut, und das Internet ist voller Fragen wie "Warum ist das Umbenennen für Ordner im S3-Browser ausgegraut?"
Steve
1

Wie von Naaz beantwortet, ist eine direkte Umbenennung von s3 nicht möglich.

Ich habe ein Code-Snippet angehängt, das den gesamten Inhalt kopiert

Der Code funktioniert. Fügen Sie einfach Ihren aws-Zugriffsschlüssel und Ihren geheimen Schlüssel hinzu

Hier ist, was ich im Code getan habe

-> Kopieren Sie den Inhalt des Quellordners (verschachteltes Kind und Ordner) und fügen Sie ihn in den Zielordner ein

-> Wenn der Kopiervorgang abgeschlossen ist, löschen Sie den Quellordner

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

}}

Mateen
quelle
2
Bitte überlegen Sie, Ihren Code zu bearbeiten, da diese Implementierung nicht den gesamten Inhalt zurückgibt, wie Sie impliziert haben. Wenn Sie listObjects (BucketName, KeyName) aufrufen, werden höchstens 1000 Elemente zurückgegeben. Sie sollten die ObjectListing.isTruncated () -Methode aufrufen, um dies zu wissen wenn ein neuer Anforderungsaufruf erforderlich ist. Betrachten Sie dies als Referenz docs.aws.amazon.com/AmazonS3/latest/dev/…
le0diaz
Dies funktioniert, aber ich stimme auch dem obigen Kommentar zu. Ersetzen Sie einfach List <S3ObjectSummary> fileList = s3client.listObjects (BucketName, KeyName) .getObjectSummaries (); mit 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

Datei und Ordner sind tatsächlich Objekte in S3. Sie sollten PUT OBJECT COPY verwenden, um sie umzubenennen. Siehe http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html

okwap
quelle
1
Während einige Sprachen kein von AWS angebotenes SDK haben, Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScripttun es die großen ( ) und es gibt keinen Grund, sie nicht zu verwenden. aws.amazon.com/tools
Don Cheadle
3
Das Java SDK von AWS ist für clientseitige Anwendungen zu groß (und monolithisch).
Jesse Barnum
0

S3DirectoryInfo verfügt über eine MoveTo- Methode, mit der ein Verzeichnis in ein anderes Verzeichnis verschoben wird, sodass das verschobene Verzeichnis zu einem Unterverzeichnis des anderen Verzeichnisses mit demselben Namen wie ursprünglich wird.

Die folgende Erweiterungsmethode verschiebt ein Verzeichnis in ein anderes Verzeichnis, dh das verschobene Verzeichnis wird zum anderen Verzeichnis. Tatsächlich wird das neue Verzeichnis erstellt, der gesamte Inhalt des alten Verzeichnisses in das Verzeichnis verschoben und anschließend das alte gelöscht.

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
quelle
0

Benennen Sie alle * .csv.err-Dateien im Verzeichnis <<bucket>>/landingin * .csv-Dateien mit s3cmd um

 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)
Yordan Georgiev
quelle
-2

Es gibt eine Software, mit der Sie mit dem s3-Bucket spielen können, um verschiedene Arten von Operationen auszuführen.

Name der Software: S3 Browser

S3 Browser ist ein Freeware-Windows-Client für Amazon S3 und Amazon CloudFront. Amazon S3 bietet eine einfache Webdienstschnittstelle, über die jederzeit und von jedem Ort im Web aus beliebig viele Daten gespeichert und abgerufen werden können. Amazon CloudFront ist ein Content Delivery Network (CDN). Es kann verwendet werden, um Ihre Dateien über ein globales Netzwerk von Edge-Standorten bereitzustellen.


Wenn es nur ein einziges Mal ist, können Sie die Befehlszeile verwenden, um die folgenden Vorgänge auszuführen:

(1) Benennen Sie den Ordner im selben Bucket um:

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

(2) Benennen Sie den Eimer um:

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

Wo,

{access_key} = Ihr gültiger Zugriffsschlüssel für den s3-Client

{secret_key} = Ihr gültiger Scret-Schlüssel für den s3-Client

Es funktioniert problemlos.

Vielen Dank

Radadiya Nikunj
quelle