Làm cách nào để đổi tên tệp và thư mục trong Amazon S3?


207

Có chức năng nào để đổi tên các tệp và thư mục trong Amazon S3 không? Bất kỳ đề xuất liên quan cũng được chào đón.

Câu trả lời:


62

Không có phương pháp trực tiếp để đổi tên một tệp trong S3. Những gì bạn phải làm là sao chép tệp hiện có với một tên mới (chỉ cần đặt khóa đích) và xóa tệp cũ.


111
Cung cấp một ví dụ với câu trả lời của bạn, nếu không hãy bình luận.
EternalHour

38
@EternalHour sẽ rất tuyệt .. nhưng không cần thiết .. Câu hỏi thậm chí không có bất kỳ dấu hiệu nào về ngôn ngữ .. vậy quan điểm của việc làm một ví dụ là gì?
Lipis

49
Đây là câu trả lời sai. Bạn có thể di chuyển tệp trên S3 bằng mv. mv = đổi tên
Nicolo

17
Đây là một câu trả lời sai vì hai lý do: 1) bạn có thể sử dụng GUI để nhấp chuột phải và đổi tên tệp và 2) như đã được đề cập trước khi bạn có thể di chuyển tệp bằng lệnh di chuyển hoặc thông qua sdk.
Maximus

11
Bạn không thể nhấp chuột phải vào tên thư mục để đổi tên nó trên S3.
khu vực51

458

Tôi vừa thử nghiệm cái này và nó hoạt động:

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

10
Có phải là nguyên tử? Lệnh thứ hai (và tương tự) sẽ thất bại trong khi đầu tiên đang thực thi?
Alex B

13
Không AWS không có hoạt động di chuyển nguyên tử
AP.

1
Cảm ơn! Tại sao chúng ta cần --recursive?
Aziz Alto

2
@AzizAlto Trong trường hợp có cấu trúc thư mục sâu hơn s3://<bucketname>/<folder_name_from>, tức là s3://<bucketname>/<folder_name_from>/some/deeper/folders.
Ville

1
@JohnEikenberry Tôi không thể tin bình luận sai của Raj có 15 lượt ủng hộ. Nó sẽ bị xóa. Chỉnh sửa: Và nó vừa bị xóa. Đẹp.
Doug S

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

6
Được cptheo sau bởi rmthích hợp hơn mv?
Pyderman

11
Tôi thích cp / rm hơn mv vì bạn có thể kiểm tra xem bản sao đã được thực hiện thành công hay chưa trước khi thực hiện bất kỳ thao tác xóa nào.
Thang Trần

1
Bạn có thể sử dụng cờ --dryrun để kiểm tra đầu ra của lệnh mà không thực sự chạy nó.
kmundnic


15

Bạn có thể sử dụng lệnh AWS CLI hoặc s3cmd để đổi tên các tệp và thư mục trong nhóm AWS S3.

Sử dụng S3cmd, sử dụng cú pháp sau để đổi tên thư mục,

s3cmd --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>

Sử dụng AWS CLI, sử dụng cú pháp sau để đổi tên thư mục,

aws s3 --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>

1
Điều gì xảy ra nếu tôi cần đổi tên tất cả các tệp .csv. làm thế nào tôi làm
LUZO

14

Tôi vừa mới làm việc này. Bạn có thể sử dụng SDK AWS cho PHP như thế này:

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


Để bắt chước hoàn toàn việc đổi tên (trái ngược với sao chép và sau đó phải xóa thư mục gốc), bạn có thể tạo nguồn và đích giống nhau không? Hoặc bạn phải làm cho chúng khác nhau, sau đó xóa thư mục gốc?
Pyderman

Tôi nghĩ rằng tôi đã làm một bản sao sau đó xóa bản gốc. Từ bộ nhớ, tôi đã viết câu trả lời này để tham khảo cho riêng mình - câu trả lời được chấp nhận cũng nói như vậy, nhưng không đưa ra ví dụ về mã. Mặt khác, tôi khuyên bạn nên có một cái nhìn mới mẻ thông qua các tài liệu AWS, bởi vì chúng luôn luôn phát triển các tùy chọn mới.
Tom

Ví dụ này 'chỉ' hiển thị chức năng sao chép, thay vì 'di chuyển', (hoặc 'đổi tên'). Tôi biết nó đã vài năm tuổi, nhưng bất kỳ cơ hội nào bạn có thể cập nhật nó với chức năng hoàn chỉnh? Lưu ý rằng S3 sẽ tạo đối tượng 'di chuyển' dưới dạng đối tượng mới với dấu thời gian mới, v.v. (iirc).
JamesBB

10

Chúng tôi có 2 cách để có thể đổi tên tệp trên bộ lưu trữ AWS S3 -

1. Sử dụng công cụ CLI -

aws s3 --recursive mv s3: // tên xô / dirname / oldfile s3: // tên xô / dirname / newfile

2.Sử dụng SDK

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

8

Không có cách nào để đổi tên một thư mục thông qua GUI, cách nhanh nhất (và dễ nhất nếu bạn thích GUI) để đạt được điều này là thực hiện một bản sao cũ đơn giản. Để đạt được điều này: tạo thư mục mới trên S3 bằng GUI, truy cập thư mục cũ của bạn, chọn tất cả, đánh dấu "sao chép" và sau đó điều hướng đến thư mục mới và chọn "dán". Khi hoàn tất, loại bỏ thư mục cũ.

Phương pháp đơn giản này rất nhanh vì nó là bản sao từ S3 sang chính nó (không cần tải lên lại hoặc bất cứ thứ gì tương tự) và nó cũng duy trì các quyền và siêu dữ liệu của các đối tượng được sao chép như bạn mong đợi.


@Trisped Trong thử nghiệm của tôi chỉ một lúc trước, các tệp có thể được đổi tên bằng GUI web, nhưng không phải là thư mục .
rinogo

7

Điều này hiện có thể cho Tệp, chọn tệp rồi chọn Thêm> Đổi tên trong GUI.

Để đổi tên thư mục, thay vào đó, bạn phải tạo một thư mục mới và chọn nội dung của thư mục cũ và sao chép / dán nó qua (Trong "Thêm" lần nữa)


5

Đây là cách bạn làm điều đó trong .NET, sử dụng S3 .NET SDK:

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

PS cố gắng sử dụng các phiên bản "Async" của các phương thức máy khách nếu có thể, mặc dù tôi đã không làm như vậy để dễ đọc


4

Điều này hoạt động để đổi tên tập tin trong cùng một thư mục

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

1
Không nhất thiết phải trong cùng một thư mục. Lệnh bạn cung cấp hoạt động như một lá bùa. Cảm ơn bạn.
R.Cha

3

Dưới đây là ví dụ mã để đổi tên tệp trên s3. Tệp của tôi là part-000 * vì tệp spark o / p, sau đó tôi sao chép nó sang tên tệp khác trên cùng một vị trí và xóa phần-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)

chỉ cần lưu ý rằng đây là sử dụng python
f.khantsis

2

Trong bảng điều khiển AWS, nếu bạn điều hướng đến S3, bạn sẽ thấy các thư mục của mình được liệt kê. Nếu bạn điều hướng đến thư mục, bạn sẽ thấy (các) đối tượng được liệt kê. nhấp chuột phải và bạn có thể đổi tên. HOẶC, bạn có thể chọn hộp phía trước đối tượng của mình, sau đó từ menu kéo xuống có tên HÀNH ĐỘNG, bạn có thể chọn đổi tên. Chỉ làm việc cho tôi, 3-31-2019


"đổi tên" bị mờ đi đối với tôi đối với các thư mục và internet có rất nhiều câu hỏi như "tại sao lại đổi tên thành màu xám cho các thư mục trong trình duyệt S3?"
Steve

1

Như trả lời bởi Naaz đổi tên trực tiếp của s3 là không thể.

tôi đã đính kèm một đoạn mã sẽ sao chép tất cả các nội dung

mã đang hoạt động chỉ cần thêm khóa truy cập aws và khóa bí mật của bạn

đây là những gì tôi đã làm trong mã

-> sao chép nội dung thư mục nguồn (con và thư mục lồng nhau) và dán vào thư mục đích

-> khi sao chép xong, xóa thư mục nguồn

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
Vui lòng xem xét chỉnh sửa mã của bạn vì việc triển khai này không trả về tất cả nội dung, như bạn đã ngụ ý, vì khi bạn gọi listObjects (buckName, keyName), nó sẽ trả về tối đa 1000 mục, bạn nên gọi phương thức ObjectListing.isTruncated () để biết nếu một cuộc gọi yêu cầu mới là cần thiết. Hãy xem đây là tài liệu tham khảo docs.aws.amazon.com/AmazonS3/latest/dev/iêu
le0diaz

Điều này hoạt động nhưng tôi cũng đồng ý với nhận xét trên. Chỉ cần thay thế Danh sách <S3ObjectSummary> fileList = s3client.listObjects (buckName, keyName) .getObjectSummaries (); với ObjectListing objectListing = s3.listObjects (buckName, keyName); Danh sách <S3ObjectSummary> fileList = new ArrayList <> (); fileList.add ALL (objectListing.getObjectSummaries ()); while (objectListing.isTruncated ()) {objectListing = s3.listNextBatchOfObjects (objectListing); fileList.add ALL (objectListing.getObjectSummaries ()); }
Karthik

0

Tệp và thư mục trong thực tế là các đối tượng trong S3. Bạn nên sử dụng PUT OBOG COPY để đổi tên chúng. Xem http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html


1
trong khi một số ngôn ngữ không có SDK do AWS cung cấp, thì những ngôn ngữ lớn ( Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript) làm và không có lý do gì để không sử dụng chúng aws.amazon.com/tools
Don Cheadle

3
SDK Java từ AWS quá lớn (và nguyên khối) cho các ứng dụng phía máy khách.
Jesse Barnum

0

S3DirectoryInfo có một phương thức MoveTo sẽ di chuyển một thư mục sang một thư mục khác, sao cho thư mục được di chuyển sẽ trở thành thư mục con của thư mục khác có cùng tên như ban đầu.

Phương thức mở rộng dưới đây sẽ di chuyển một thư mục sang thư mục khác, tức là thư mục đã di chuyển sẽ trở thành thư mục khác. Những gì nó thực sự làm là tạo thư mục mới, di chuyển tất cả nội dung của thư mục cũ vào đó, và sau đó xóa thư mục cũ.

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

đổi tên tất cả các tệp * .csv.err trong <<bucket>>/landingthư mục thành các tệp * .csv với 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

Có một phần mềm mà bạn có thể chơi với thùng s3 để thực hiện các loại hoạt động khác nhau.

Tên phần mềm: Trình duyệt S3

Trình duyệt S3 là ứng dụng khách Windows miễn phí dành cho Amazon S3 và Amazon CloudFront. Amazon S3 cung cấp giao diện dịch vụ web đơn giản có thể được sử dụng để lưu trữ và truy xuất bất kỳ lượng dữ liệu nào, bất cứ lúc nào, từ bất kỳ đâu trên web. Amazon CloudFront là một mạng phân phối nội dung (CDN). Nó có thể được sử dụng để phân phối các tệp của bạn bằng cách sử dụng một mạng lưới toàn cầu của các vị trí cạnh.


Nếu chỉ một lần duy nhất thì bạn có thể sử dụng dòng lệnh để thực hiện các thao tác này:

(1) Đổi tên thư mục trong cùng một nhóm:

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

(2) Đổi tên nhóm:

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

Ở đâu,

{access_key} = Khóa truy cập hợp lệ của bạn cho máy khách s3

{secret_key} = Khóa scret hợp lệ của bạn cho máy khách s3

Nó hoạt động tốt mà không có vấn đề gì.

Cảm ơn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.