จะเปลี่ยนชื่อไฟล์และโฟลเดอร์ใน Amazon S3 ได้อย่างไร


208

มีฟังก์ชั่นในการเปลี่ยนชื่อไฟล์และโฟลเดอร์ใน Amazon S3 หรือไม่? ข้อเสนอแนะที่เกี่ยวข้องใด ๆ ก็ยินดีต้อนรับ

คำตอบ:


62

ไม่มีวิธีโดยตรงในการเปลี่ยนชื่อไฟล์ใน S3 สิ่งที่คุณต้องทำคือคัดลอกไฟล์ที่มีอยู่ด้วยชื่อใหม่ (เพียงตั้งค่าคีย์เป้าหมาย) และลบไฟล์เก่า


112
ให้ตัวอย่างกับคำตอบของคุณมิฉะนั้นแสดงความคิดเห็น
EternalHour

38
@ นิรันดร์ของคุณจะดี .. แต่ก็ไม่จำเป็น .. คำถามไม่ได้มีข้อบ่งชี้เกี่ยวกับภาษา .. ดังนั้นจุดที่ทำตัวอย่างคืออะไร?
Lipis

49
นี่เป็นคำตอบที่ผิด คุณสามารถย้ายไฟล์บน S3 โดยใช้ mv mv = เปลี่ยนชื่อ
Nicolo

17
นี่เป็นคำตอบที่ผิดด้วยเหตุผลสองประการ: 1) คุณสามารถใช้ GUI เพื่อคลิกขวาและเปลี่ยนชื่อไฟล์และ 2) ตามที่ได้กล่าวไว้ก่อนที่คุณจะสามารถย้ายไฟล์ด้วยคำสั่ง move หรือผ่าน sdk
Maximus

11
คุณไม่สามารถคลิกขวาที่ชื่อโฟลเดอร์เพื่อเปลี่ยนชื่อใน S3
area51

459

ฉันเพิ่งทดสอบและใช้งานได้:

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

10
มันเป็นอะตอมหรือไม่? คำสั่งที่สอง (และเหมือนกัน) จะล้มเหลวในขณะที่กำลังดำเนินการครั้งแรกหรือไม่
Alex B

13
ไม่มี AWS ไม่มีการย้ายอะตอม
AP

1
ขอบคุณ! ทำไมเราต้อง--recursive?
Aziz Alto

2
@AzizAlto ในกรณีที่มีโครงสร้างโฟลเดอร์ลึกภายใต้คือs3://<bucketname>/<folder_name_from> s3://<bucketname>/<folder_name_from>/some/deeper/folders
วิลล์

1
@JohnEikenberry ฉันไม่อยากเชื่อความคิดเห็นที่ผิดของ Raj มีผู้ลงคะแนน 15 คน มันควรจะถูกลบ แก้ไข: และตอนนี้เพิ่งถูกลบ ดี
Doug S

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

6
เป็นcpตามrmที่จะดีกว่าmv?
Pyderman

12
ฉันชอบ cp / rm มากกว่า mv เนื่องจากคุณสามารถตรวจสอบว่าสำเนาถูกทำสำเร็จก่อนทำการลบหรือไม่
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

14

ฉันเพิ่งได้ทำงานนี้ คุณสามารถใช้ AWS SDK สำหรับ 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

ฉันคิดว่าฉันทำสำเนาแล้วลบต้นฉบับ จากหน่วยความจำฉันเขียนคำตอบนี้สำหรับการอ้างอิงของฉันเอง - คำตอบที่ยอมรับนั้นเหมือนกัน แต่ไม่ได้ให้ตัวอย่างรหัส ในทางกลับกันฉันขอแนะนำให้คุณดูใหม่ผ่านเอกสาร AWS เพราะพวกเขากำลังพัฒนาตัวเลือกใหม่อยู่ตลอดเวลา
ทอม

ตัวอย่าง 'just' แสดงฟังก์ชันการทำสำเนามากกว่า 'ย้าย' (หรือ 'เปลี่ยนชื่อ') ฉันรู้ว่ามันมีอายุไม่กี่ปี แต่มีโอกาสใดที่คุณสามารถอัปเดตด้วยฟังก์ชั่นที่สมบูรณ์ โปรดทราบว่า S3 จะสร้างวัตถุ 'ย้าย' เป็นวัตถุใหม่ที่มีการประทับเวลาใหม่ ฯลฯ (iirc)
JamesBB

10

เรามี 2 วิธีโดยที่เราสามารถเปลี่ยนชื่อไฟล์บนที่เก็บ AWS S3 -

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) คือการทำสำเนาเก่าแบบธรรมดา เพื่อให้บรรลุสิ่งนี้: สร้างโฟลเดอร์ใหม่บน S3 โดยใช้ GUI ไปที่โฟลเดอร์เก่าของคุณเลือกทั้งหมดทำเครื่องหมาย "คัดลอก" จากนั้นไปที่โฟลเดอร์ใหม่แล้วเลือก "วาง" เมื่อเสร็จแล้วให้ลบโฟลเดอร์เก่าออก

วิธีการง่ายๆนี้รวดเร็วมากเพราะเป็นสำเนาจาก S3 ไปยังตัวเอง (ไม่จำเป็นต้องอัปโหลดใหม่หรืออะไรทำนองนั้น) และมันยังคงสิทธิ์และเมตาดาต้าของวัตถุที่คัดลอกอย่างที่คุณคาดไว้


@Trisped ในการทดสอบของฉันเพียงแค่ช่วงเวลาที่ผ่านมาไฟล์อาจจะเปลี่ยนชื่อโดยใช้เว็บ 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 พยายามใช้วิธีไคลเอ็นต์ในแบบ "Async" ถ้าเป็นไปได้แม้ว่าฉันจะไม่ได้อ่าน


4

ใช้งานได้กับการเปลี่ยนชื่อไฟล์ในโฟลเดอร์เดียวกัน

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

1
ไม่จำเป็นต้องอยู่ในโฟลเดอร์เดียวกัน คำสั่งที่คุณให้ไว้ทำงานเหมือนมีเสน่ห์ ขอบคุณ.
R.Cha

3

ด้านล่างนี้เป็นตัวอย่างรหัสเพื่อเปลี่ยนชื่อไฟล์ใน s3 ไฟล์ของฉันเป็นส่วนหนึ่ง -000 * เนื่องจากไฟล์ spark o / p จากนั้นฉันคัดลอกไปยังชื่อไฟล์อื่นในตำแหน่งเดียวกันและลบส่วนที่ 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 คุณจะเห็นโฟลเดอร์ของคุณอยู่ในรายการ หากคุณนำทางไปยังโฟลเดอร์คุณจะเห็นรายการวัตถุ คลิกขวาและคุณสามารถเปลี่ยนชื่อ หรือคุณสามารถทำเครื่องหมายที่ช่องด้านหน้าวัตถุของคุณจากนั้นเลือกเมนู ACTIONS จากเมนูแบบเลื่อนลงคุณสามารถเลือกเปลี่ยนชื่อ เพิ่งได้ผลสำหรับฉัน 3-31-2019


"rename" เป็นสีเทาสำหรับฉันสำหรับโฟลเดอร์และอินเทอร์เน็ตเต็มไปด้วยคำถามเช่น "ทำไมจึงเปลี่ยนชื่อ greyed out สำหรับโฟลเดอร์ในเบราว์เซอร์ S3"
Steve

1

ตามที่ตอบโดย Naaz การเปลี่ยนชื่อโดยตรงของ s3 เป็นไปไม่ได้

ฉันแนบตัวอย่างรหัสซึ่งจะคัดลอกเนื้อหาทั้งหมด

รหัสใช้งานได้เพียงเพิ่มรหัสการเข้าถึงและรหัสลับของคุณ

นี่คือสิ่งที่ฉันทำในรหัส

-> คัดลอกเนื้อหาของโฟลเดอร์ต้นทาง (รายการย่อยและโฟลเดอร์) และวางในโฟลเดอร์ปลายทาง

-> เมื่อการคัดลอกเสร็จสิ้นให้ลบโฟลเดอร์ต้นทาง

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) จะส่งคืนได้ไม่เกิน 1,000 รายการคุณควรเรียกใช้เมธอด ObjectListing.isTruncated () ถ้าจำเป็นต้องทำการร้องขอการร้องขอใหม่ พิจารณาสิ่งนี้เป็นเอกสารอ้างอิงdocs.aws.amazon.com/AmazonS3/latest/dev/…
le0diaz

ใช้งานได้ แต่ฉันก็เห็นด้วยกับความคิดเห็นด้านบน เพียงแทนที่ List <S3ObjectSummary> fileList = s3client.listObjects (bucketName, keyName) .getObjectSummaries (); ด้วย ObjectListing objectListing = s3.listObjects (bucketName, keyName); รายการ <S3ObjectSummary> fileList = new ArrayList <> (); fileList.addAll (objectListing.getObjectSummaries ()); ในขณะที่ (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
ในขณะที่บางภาษาไม่มี SDK ที่ AWS นำเสนอ แต่ตัวใหญ่ ( Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript) ทำและไม่มีเหตุผลที่จะไม่ใช้awsamazon.com/tools
Don Cheadle

3
Java SDK จาก AWS มีขนาดใหญ่เกินไป (และเสาหิน) สำหรับแอปพลิเคชันฝั่งไคลเอ็นต์
Jesse Barnum

0

S3DirectoryInfo มีเมธอดMoveToที่จะย้ายหนึ่งไดเร็กทอรีไปยังอีกไดเร็กทอรีหนึ่งเช่นไดเร็กทอรีที่ถูกย้ายจะกลายเป็นไดเร็กทอรีย่อยของไดเร็กทอรีอื่นที่มีชื่อเหมือนกับที่เคยมีมา

วิธีการขยายด้านล่างจะย้ายหนึ่งไดเรกทอรีไปยังอีกไดเรกทอรีหนึ่งเช่นไดเรกทอรีที่ถูกย้ายจะกลายเป็นอีกไดเรกทอรีหนึ่ง สิ่งที่จริง ๆ แล้วคือสร้างไดเรกทอรีใหม่ย้ายเนื้อหาทั้งหมดของไดเรกทอรีเก่าลงในนั้นแล้วลบไดเรกทอรีเก่า

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

เปลี่ยนชื่อไฟล์ * .csv.err ทั้งหมดใน<<bucket>>/landingdir เป็นไฟล์ * .csv ด้วย 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)

-2

มีซอฟต์แวร์เดียวที่คุณสามารถเล่นกับที่เก็บข้อมูล s3 เพื่อดำเนินการกับการใช้งานประเภทต่าง ๆ ได้

ชื่อซอฟต์แวร์: S3 Browser

S3 Browserเป็นไคลเอนต์ Windows ฟรีแวร์สำหรับ Amazon S3 และ Amazon CloudFront Amazon S3 มีอินเทอร์เฟซบริการเว็บอย่างง่ายที่สามารถใช้ในการจัดเก็บและเรียกใช้ข้อมูลจำนวนเท่าใดก็ได้ทุกที่ทุกเวลาบนเว็บ Amazon CloudFront เป็นเครือข่ายการส่งเนื้อหา (CDN) มันสามารถใช้ในการส่งไฟล์ของคุณโดยใช้เครือข่ายทั่วโลกของสถานที่ขอบ


หากเป็นเพียงครั้งเดียวคุณสามารถใช้บรรทัดคำสั่งเพื่อดำเนินการเหล่านี้:

(1) เปลี่ยนชื่อโฟลเดอร์ในที่ฝากข้อมูลเดียวกัน:

s3cmd --access_key={access_key} --secret_key={secret_key} mv s3://bucket/folder1/* s3://bucket/folder2/

(2) เปลี่ยนชื่อ Bucket:

s3cmd --access_key={access_key} --secret_key={secret_key} mv s3://bucket1/folder/* s3://bucket2/folder/

ที่ไหน

{access_key} = รหัสการเข้าถึงที่ถูกต้องของคุณสำหรับไคลเอ็นต์ s3

{secret_key} = รหัสที่ถูกต้องของคุณสำหรับลูกค้า s3

มันทำงานได้ดีโดยไม่มีปัญหาใด ๆ

ขอบคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.