Risposte:
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.
Ho appena provato questo e funziona:
aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
--recursive
?
s3://<bucketname>/<folder_name_from>
, ad es 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
seguito da rm
preferibile a mv
?
Puoi utilizzare i comandi della CLI AWS per mv
i file
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>
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
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}",));
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.
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à
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
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)
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
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;
}
}
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
Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript
) lo fanno e non c'è motivo di non usarle aws.amazon.com/tools
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;
}
}
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)
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