Amazon S3でファイルとフォルダーの名前を変更するにはどうすればよいですか?


回答:


62

S3でファイルの名前を変更する直接的な方法はありません。あなたがしなければならないことは、既存のファイルを新しい名前でコピーし(ターゲットキーを設定するだけ)、古いファイルを削除することです。


112
答えを例に挙げてください。そうでない場合はコメントしてください。
EternalHour 2014年

38
@EternalHourはいいでしょう..しかし、それは必要ではありません..質問には言語についての表示さえありません。
Lipis

50
これは間違った答えです。mvを使用してS3上のファイルを移動できます。mv = rename
Nicolo

17
これは2つの理由で間違った答えです。1)GUIを使用してファイルを右クリックして名前を変更できること、2)moveコマンドまたはSDKを使用してファイルを移動する前に言及されているとおりです。
Maximus

11
S3でフォルダ名を右クリックして名前を変更することはできません。
エリア51

460

私はこれをテストしたところ、うまくいきました:

aws s3 --recursive mv s3://<bucketname>/<folder_name_from> s3://<bucket>/<folder_name_to>

10
それは原子ですか?最初の実行中に2番目(および同じ)コマンドが失敗しますか?
Alex B

13
AWSにはアトミックな移動操作がない
AP。

1
ありがとう!なぜ必要なの--recursiveですか?
Aziz Alto

2
@AzizAltoの下s3://<bucketname>/<folder_name_from>に深いフォルダ構造がある場合、つまりs3://<bucketname>/<folder_name_from>/some/deeper/folders
Ville

1
@JohnEikenberry Rajの間違ったコメントに15の賛成票があるとは信じられません。削除する必要があります。編集:そして、それはちょうど今削除されました。いいね。
Doug S

32
aws s3 cp s3://source_folder/ s3://destination_folder/ --recursive
aws s3 rm s3://source_folder --recursive

6
cp続いてrmより好ましいmvですか?
Pyderman、2015

12
削除を行う前にコピーが正常に作成されたかどうかを確認できるので、mvよりもcp / rmをお勧めします。
Thang Tran

2
--dryrunフラグを使用して、実際に実行せずにコマンドの出力を確認できます。
kmundnic


15

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>

1
すべての.csvファイルの名前を変更する必要がある場合はどうなりますか?どうして私は?
LUZO 2018年

14

私はこれを機能させています。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


(元のフォルダーをコピーしてから削除する必要があるのではなく)名前の変更を完全に模倣するために、ソースとターゲットを同じにすることができましたか?または、それらを異なるものにしてから、元のフォルダーを削除する必要がありましたか?
Pyderman、2015

コピーしてからオリジナルを削除したと思います。記憶から私は自分の参考のためにこの回答を書きました-受け入れられた回答は同じことを言いますが、コード例は与えませんでした。一方、AWSドキュメントは常に新しいオプションを進化させているため、AWSドキュメントを再確認することをお勧めします。
トム

この例は、「移動」(または「名前変更」)ではなく、コピー機能を示しています。私はそれが数年前のものであることを知っていますが、完全な機能で更新できる可能性はありますか?S3は「移動」オブジェクトを新しいタイムスタンプなどの新しいオブジェクトとして作成することに注意してください(iirc)。
JamesBB

10

AWS S3ストレージ上のファイルの名前を変更する方法は2つあります-

1 .CLIツールの使用-

aws s3 --recursive mv s3:// bucket-name / dirname / oldfile s3:// bucket-name / dirname / newfile

2. SDKの使用

$s3->copyObject(array(
'Bucket'     => $targetBucket,
'Key'        => $targetKeyname,
'CopySource' => "{$sourceBucket}/{$sourceKeyname}",));

8

GUIを使用してフォルダーの名前を変更する方法はありません。これを実現する最も速い(そしてGUIが好きな場合は最も簡単な)方法は、単純な古いコピーを実行することです。これを実現するには、GUIを使用してS3に新しいフォルダーを作成し、古いフォルダーに移動してすべてを選択し、「コピー」をマークしてから、新しいフォルダーに移動して「貼り付け」を選択します。完了したら、古いフォルダを削除します。

この単純な方法はS3からそれ自体へのコピーであり(再アップロードなどは不要)、非常に高速です。また、コピーしたオブジェクトの権限とメタデータを期待どおりに維持します。


@Trisped少し前のテストでは、ファイルはWeb GUIを使用して名前を変更できますが、フォルダーは変更できません。
rinogo

7

これはファイルで可能になりました。ファイルを選択し、GUIで[その他]> [名前の変更]を選択します。

フォルダーの名前を変更するには、代わりに新しいフォルダーを作成し、古いフォルダーのコンテンツを選択して、コピー/貼り付けする必要があります(「その他」の下にもう一度)


5

.NETでの使用方法はS3 .NET SDK次のとおりです。

var client = new Amazon.S3.AmazonS3Client(_credentials, _config);
client.CopyObject(oldBucketName, oldfilepath, newBucketName, newFilePath);
client.DeleteObject(oldBucketName, oldfilepath);

PSは、可読性のためにそうしていなくても、可能な場合はクライアントメソッドの「非同期」バージョンを使用しようとします


4

これは同じフォルダ内のファイルの名前を変更するために機能します

aws s3  mv s3://bucketname/folder_name1/test_original.csv s3://bucket/folder_name1/test_renamed.csv

1
同じフォルダにある必要はありません。指定したコマンドはチャームのように機能します。ありがとうございました。
R.Cha 2018

3

以下は、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)

これはpythonを使用していることに注意してください
f.khantsis

2

AWSコンソールでS3に移動すると、フォルダーが一覧表示されます。フォルダに移動すると、オブジェクトが一覧表示されます。右クリックして名前を変更できます。または、オブジェクトの前にあるチェックボックスをオンにして、アクションという名前のプルダウンメニューから、名前の変更を選択できます。ちょうど私のために働いた、3-31-2019


フォルダの[名前の変更]がグレー表示され、インターネットで「S3ブラウザのフォルダの名前がグレー表示されるのはなぜですか?」
Steve

1

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;
}

}


2
この実装ではすべてのコンテンツが返されるわけではないため、コードを編集することを検討してください。これは、暗黙的にlistObjects(bucketName、keyName)を呼び出すと、最大1000の項目が返されるため、ObjectListing.isTruncated()メソッドを呼び出して知る必要があるためです。新しいリクエストの呼び出しが必要な場合。リファレンスとしてこれを考えてみましょうdocs.aws.amazon.com/AmazonS3/latest/dev/...
le0diaz

これは機能しますが、上記のコメントにも同意します。List <S3ObjectSummary> fileList = s3client.listObjects(bucketName、keyName).getObjectSummaries();を置き換えるだけです。ObjectListingの場合objectListing = s3.listObjects(bucketName、keyName); List <S3ObjectSummary> fileList = new ArrayList <>(); fileList.addAll(objectListing.getObjectSummaries()); while(objectListing.isTruncated()){objectListing = s3.listNextBatchOfObjects(objectListing); fileList.addAll(objectListing.getObjectSummaries()); }
Karthik

0

ファイルとフォルダーは、実際にはS3のオブジェクトです。それらの名前を変更するには、PUT OBJECT COPYを使用する必要があります。http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.htmlを参照してください


1
一部の言語にはAWSが提供するSDKがありませんが、大きな言語(Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript)にはあり、それらを使用しない理由はありません。aws.amazon.com/ tools
Don Cheadle

3
AWSのJava SDKは、クライアント側のアプリケーションには大きすぎます(そして一体型です)。
Jesse Barnum、2015年

0

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;
    }
}

0

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)

-2

さまざまな種類の操作を実行するために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クライアントの有効なスクレットキー

問題なく正常に動作しています。

ありがとう

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.