Respuestas:
No hay un método directo para cambiar el nombre de un archivo en S3. Lo que tiene que hacer es copiar el archivo existente con un nuevo nombre (solo configure la clave de destino) y elimine el antiguo.
Acabo de probar esto y funciona:
aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
--recursive
?
s3://<bucketname>/<folder_name_from>
, es decir 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
seguido por rm
preferible a mv
?
Puede usar los comandos de mv
la CLI de AWS para los archivos
Puede usar AWS CLI o el comando s3cmd para cambiar el nombre de los archivos y carpetas en el bucket de AWS S3.
Con S3cmd, use la siguiente sintaxis para cambiar el nombre de una carpeta,
s3cmd --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
Con AWS CLI, use la siguiente sintaxis para cambiar el nombre de una carpeta,
aws s3 --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
Acabo de hacer que esto funcione. Puede usar AWS SDK para PHP de esta manera:
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
Tenemos 2 formas de cambiar el nombre de un archivo en el almacenamiento de AWS S3
1.Utilizando la herramienta CLI -
aws s3 - mv recursivo s3: // nombre-cubo / dirname / oldfile s3: // nombre-cubo / dirname / newfile
2.Utilizando SDK
$s3->copyObject(array(
'Bucket' => $targetBucket,
'Key' => $targetKeyname,
'CopySource' => "{$sourceBucket}/{$sourceKeyname}",));
No hay forma de cambiar el nombre de una carpeta a través de la GUI, la forma más rápida (y más fácil si lo desea) es realizar una copia antigua simple. Para lograr esto: cree la nueva carpeta en S3 usando la GUI, acceda a su carpeta anterior, seleccione todo, marque "copiar" y luego navegue a la nueva carpeta y elija "pegar". Cuando termine, elimine la carpeta anterior.
Este método simple es muy rápido porque se copia de S3 a sí mismo (no es necesario volver a cargarlo ni nada por el estilo) y también mantiene los permisos y metadatos de los objetos copiados como cabría esperar.
Así es como lo haces en .NET, usando S3 .NET SDK
:
var client = new Amazon.S3.AmazonS3Client(_credentials, _config);
client.CopyObject(oldBucketName, oldfilepath, newBucketName, newFilePath);
client.DeleteObject(oldBucketName, oldfilepath);
PD: intente usar versiones "asíncronas" de los métodos del cliente cuando sea posible, aunque no lo he hecho para facilitar la lectura
Esto funciona para renombrar el archivo en la misma carpeta
aws s3 mv s3://bucketname/folder_name1/test_original.csv s3://bucket/folder_name1/test_renamed.csv
A continuación se muestra el ejemplo de código para cambiar el nombre del archivo en s3. Mi archivo era parte 000 * debido al archivo spark o / p, luego lo copio a otro nombre de archivo en la misma ubicación y 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)
En la consola de AWS, si navega a S3, verá sus carpetas en la lista. Si navega a la carpeta, verá los objetos enumerados. Haga clic derecho y puede cambiar el nombre. O bien, puede marcar la casilla frente a su objeto, luego, desde el menú desplegable llamado ACCIONES, puede seleccionar cambiar el nombre. Acabo de trabajar para mí, 3-31-2019
Como respondió Naaz, el cambio de nombre directo de s3 no es posible.
He adjuntado un fragmento de código que copiará todo el contenido
el código está funcionando solo agregue su clave de acceso aws y clave secreta
esto es lo que hice en el código
-> copie el contenido de la carpeta de origen (hijo anidado y carpetas) y pegue en la carpeta de destino
-> cuando se complete la copia, elimine la carpeta de origen
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;
}
}
Archivo y carpeta son, de hecho, objetos en S3. Debe utilizar PONER OBJETO COPIA para cambiarles el nombre. Ver http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html
Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript
) sí lo tienen y no hay razón para no usarlos aws.amazon.com/tools
S3DirectoryInfo tiene un método MoveTo que moverá un directorio a otro directorio, de modo que el directorio movido se convertirá en un subdirectorio del otro directorio con el mismo nombre que tenía originalmente.
El siguiente método de extensión moverá un directorio a otro directorio, es decir, el directorio movido se convertirá en el otro directorio. Lo que realmente hace es crear el nuevo directorio, mover todos los contenidos del directorio anterior y luego eliminar el antiguo.
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;
}
}
cambie el nombre de todos los archivos * .csv.err en el <<bucket>>/landing
directorio a archivos * .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)
Hay un software donde puedes jugar con el cubo s3 para realizar diferentes tipos de operaciones.
Nombre del software: S3 Browser
S3 Browser es un cliente de Windows gratuito para Amazon S3 y Amazon CloudFront. Amazon S3 proporciona una interfaz de servicios web simple que se puede utilizar para almacenar y recuperar cualquier cantidad de datos, en cualquier momento, desde cualquier lugar de la web. Amazon CloudFront es una red de entrega de contenido (CDN). Se puede usar para entregar sus archivos usando una red global de ubicaciones de borde.
Si es solo una vez, puede usar la línea de comando para realizar estas operaciones:
(1) Cambie el nombre de la carpeta en el mismo depósito:
s3cmd --access_key={access_key} --secret_key={secret_key} mv s3://bucket/folder1/* s3://bucket/folder2/
(2) Cambiar el nombre del cubo:
s3cmd --access_key={access_key} --secret_key={secret_key} mv s3://bucket1/folder/* s3://bucket2/folder/
Dónde,
{access_key} = Su clave de acceso válida para el cliente s3
{secret_key} = Su clave de tornillo válida para el cliente s3
Funciona bien sin ningún problema.
Gracias