Réponses:
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.
Je viens de tester cela et cela fonctionne:
aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
--recursive
?
s3://<bucketname>/<folder_name_from>
, ie 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
suivi de rm
préférable à mv
?
Vous pouvez utiliser les commandes AWS CLI pour mv
les fichiers
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>
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
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}",));
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.
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)
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é
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
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)
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
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;
}
}
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
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
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;
}
}
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)
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