Amazon S3에서 파일과 폴더의 이름을 바꾸는 방법은 무엇입니까?


207

Amazon S3에서 파일과 폴더의 이름을 바꾸는 기능이 있습니까? 관련 제안도 환영합니다.

답변:


62

S3에는 파일 이름을 바꾸는 직접적인 방법이 없습니다. 기존 파일을 새 이름으로 복사하고 (대상 키만 설정) 기존 파일을 삭제하면됩니다.


112
답변이 포함 된 예를 제공하고 그렇지 않으면 의견을 말하십시오.
EternalHour

38
@EternalHour는 좋을 것입니다. 그러나 필요하지는 않습니다. 질문에는 언어에 대한 표시조차 없습니다. 그래서 예제를하는 요점이 무엇입니까?
Lipis

49
이것은 잘못된 대답입니다. mv를 사용하여 S3에서 파일을 이동할 수 있습니다. 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.
Ville

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
삭제하기 전에 복사가 성공적으로 이루어 졌는지 확인할 수 있기 때문에 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

14

방금이 작업을 수행했습니다. 다음과 같이 PHP 용 AWS SDK를 사용할 수 있습니다.

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 문서를 새롭게 살펴볼 것을 권합니다.
Tom

이 예제 'just'는 'move'(또는 'rename')가 아닌 복사 기능을 보여줍니다. 몇 년 된 것이지만 완전한 기능으로 업데이트 할 수 있습니까? S3는 '이동 된'객체를 새로운 타임 스탬프 등 (iirc)을 가진 새로운 객체로 생성합니다.
JamesBB

10

AWS S3 스토리지에서 파일 이름을 바꿀 수있는 두 가지 방법이 있습니다.

1. CLI 도구 사용-

AWS S3-재귀 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 잠시 전에 테스트 에서 웹 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의 파일 이름을 바꾸는 코드 예제입니다. 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로 이동하면 폴더가 나열됩니다. 폴더를 탐색하면 객체가 나열됩니다. 마우스 오른쪽 버튼을 클릭하면 이름을 바꿀 수 있습니다. 또는 객체 앞의 확인란을 선택한 다음 ACTIONS라는 풀다운 메뉴에서 이름 바꾸기를 선택할 수 있습니다. 3-31-2019 나를 위해 일했습니다.


폴더의 경우 "이름 바꾸기"가 회색으로 표시되고 인터넷에 "S3 브라우저에서 폴더의 이름 바꾸기가 회색으로 표시되는 이유"와 같은 질문이 가득합니다.
스티브

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)를 호출 할 때 최대 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); List <S3ObjectSummary> fileList = 새 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

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

<<bucket>>/landing디렉토리의 모든 * .csv.err 파일의 이름 을 s3cmd를 사용하여 * .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 버킷으로 재생할 수있는 소프트웨어가 하나 있습니다.

소프트웨어 이름 : S3 Browser

S3 Browser 는 Amazon S3 및 Amazon CloudFront 용 프리웨어 Windows 클라이언트입니다. Amazon S3는 언제 어디서나 웹의 어느 곳에서나 많은 양의 데이터를 저장하고 검색하는 데 사용할 수있는 간단한 웹 서비스 인터페이스를 제공합니다. Amazon CloudFront는 CDN (콘텐츠 전송 네트워크)입니다. 글로벌 에지 네트워크를 사용하여 파일을 전달하는 데 사용할 수 있습니다.


한 번 뿐인 경우 명령 줄을 사용하여 다음 작업을 수행 할 수 있습니다.

(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/

어디,

{access_key} = s3 클라이언트의 유효한 액세스 키

{secret_key} = s3 클라이언트의 유효한 비밀 키

문제없이 잘 작동합니다.

감사

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.