回答:
S3でファイルの名前を変更する直接的な方法はありません。あなたがしなければならないことは、既存のファイルを新しい名前でコピーし(ターゲットキーを設定するだけ)、古いファイルを削除することです。
私はこれをテストしたところ、うまくいきました:
aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>
--recursive
ですか?
s3://<bucketname>/<folder_name_from>
に深いフォルダ構造がある場合、つまり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
続いてrm
より好ましいmv
ですか?
あなたは使用することができAWS CLIコマンドをするmv
ファイル
AWS CLIまたはs3cmdコマンドを使用して、AWS S3バケット内のファイルとフォルダーの名前を変更できます。
S3cmdを使用して、次の構文を使用してフォルダーの名前を変更します。
s3cmd --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
AWS CLIを使用して、次の構文を使用してフォルダーの名前を変更します。
aws s3 --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>
私はこれを機能させています。AWS SDK for PHPを次のように使用できます。
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
GUIを使用してフォルダーの名前を変更する方法はありません。これを実現する最も速い(そしてGUIが好きな場合は最も簡単な)方法は、単純な古いコピーを実行することです。これを実現するには、GUIを使用してS3に新しいフォルダーを作成し、古いフォルダーに移動してすべてを選択し、「コピー」をマークしてから、新しいフォルダーに移動して「貼り付け」を選択します。完了したら、古いフォルダを削除します。
この単純な方法はS3からそれ自体へのコピーであり(再アップロードなどは不要)、非常に高速です。また、コピーしたオブジェクトの権限とメタデータを期待どおりに維持します。
これは同じフォルダ内のファイルの名前を変更するために機能します
aws s3 mv s3://bucketname/folder_name1/test_original.csv s3://bucket/folder_name1/test_renamed.csv
以下は、s3でファイルの名前を変更するコード例です。私のファイルは、spark o / pファイルが原因でpart-000 *でしたが、同じ場所にある別のファイル名にコピーして、part-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)
Naazが回答したように、s3の直接の名前変更はできません。
すべてのコンテンツをコピーするコードスニペットを添付しました
コードが機能しているのは、awsアクセスキーとシークレットキーを追加するだけです。
これが私がコードでやったことです
->ソースフォルダーの内容(ネストされた子とフォルダー)をコピーし、宛先フォルダーに貼り付けます
->コピーが完了したら、ソースフォルダーを削除します
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;
}
}
ファイルとフォルダーは、実際にはS3のオブジェクトです。それらの名前を変更するには、PUT OBJECT COPYを使用する必要があります。http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.htmlを参照してください
Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript
)にはあり、それらを使用しない理由はありません。aws.amazon.com/ tools
S3DirectoryInfoには、あるディレクトリを別のディレクトリに移動するMoveToメソッドがあり、移動したディレクトリは、元のディレクトリと同じ名前の別のディレクトリのサブディレクトリになります。
以下の拡張メソッドは、1つのディレクトリを別のディレクトリに移動します。つまり、移動したディレクトリが別のディレクトリになります。それが実際に行うことは、新しいディレクトリを作成し、古いディレクトリのすべての内容をそこに移動してから、古いディレクトリを削除することです。
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;
}
}
s3cmdを使用して、<<bucket>>/landing
ディレクトリ内のすべての* .csv.errファイルの名前を* .csvファイルに変更します
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)
さまざまな種類の操作を実行するためにs3バケットを操作できるソフトウェアが1つあります。
ソフトウェア名:S3ブラウザー
S3 Browserは、Amazon S3およびAmazon CloudFront用のフリーウェアのWindowsクライアントです。Amazon S3は、Web上のどこからでも、いつでも、任意の量のデータを保存および取得するために使用できるシンプルなWebサービスインターフェイスを提供します。Amazon CloudFrontは、コンテンツ配信ネットワーク(CDN)です。エッジロケーションのグローバルネットワークを使用してファイルを配信するために使用できます。
1回だけの場合は、コマンドラインを使用して次の操作を実行できます。
(1)同じバケット内のフォルダの名前を変更します。
s3cmd --access_key={access_key} --secret_key={secret_key} mv s3://bucket/folder1/* s3://bucket/folder2/
(2)バケットの名前を変更します。
s3cmd --access_key={access_key} --secret_key={secret_key} mv s3://bucket1/folder/* s3://bucket2/folder/
どこ、
{アクセスキー} = s3クライアントの有効なアクセスキー
{secret_key} = s3クライアントの有効なスクレットキー
問題なく正常に動作しています。
ありがとう