Antworten:
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.
Ich habe das gerade getestet und es funktioniert:
aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
--recursive
?
s3://<bucketname>/<folder_name_from>
, dh s3://<bucketname>/<folder_name_from>/some/deeper/folders
.
aws s3 cp s3://source_folder/ s3://destination_folder/ --recursive
aws s3 rm s3://source_folder --recursive
cp
gefolgt von rm
vorzuziehen mv
?
Sie können die AWS CLI-Befehle für mv
die Dateien verwenden
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>
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
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}",));
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.
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
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
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)
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
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;
}
}}
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
Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript
tun es die großen ( ) und es gibt keinen Grund, sie nicht zu verwenden. aws.amazon.com/tools
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;
}
}
Benennen Sie alle * .csv.err-Dateien im Verzeichnis <<bucket>>/landing
in * .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)
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