답변:
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>
방금이 작업을 수행했습니다. 다음과 같이 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
GUI를 통해 폴더의 이름을 바꿀 수있는 방법은 없습니다. GUI를 좋아하는 가장 빠르고 쉬운 방법은 일반 오래된 사본을 수행하는 것입니다. 이를 달성하려면 : GUI를 사용하여 S3에 새 폴더를 작성하고 이전 폴더로 이동하여 모두를 선택하고 "복사"를 표시 한 다음 새 폴더로 이동하여 "붙여 넣기"를 선택하십시오. 완료되면 이전 폴더를 제거하십시오.
이 간단한 방법은 S3에서 자체로 복사하기 때문에 (재 업로드 할 필요가 없으며) 복사 한 객체의 권한과 메타 데이터를 예상대로 유지하기 때문에 매우 빠릅니다.
다음을 사용하여 .NET에서 수행하는 방법은 다음과 같습니다 S3 .NET SDK
.
var client = new Amazon.S3.AmazonS3Client(_credentials, _config);
client.CopyObject(oldBucketName, oldfilepath, newBucketName, newFilePath);
client.DeleteObject(oldBucketName, oldfilepath);
PS는 가독성을 위해하지 않은 경우에도 가능한 한 "Async"버전의 클라이언트 메소드를 사용하려고합니다.
다음은 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 메소드가 있습니다. 다른 있어 이동 된 디렉토리는 원래 이름과 같은 이름을 가진 다른 디렉토리의 서브 디렉토리가됩니다.
아래의 확장 방법은 한 디렉토리를 다른 디렉토리로 옮길 것입니다. 즉, 이동 한 디렉토리가 다른 디렉토리가됩니다. 실제로 수행하는 작업은 새 디렉토리를 작성하고 이전 디렉토리의 모든 내용을 해당 디렉토리로 이동 한 다음 이전 디렉토리를 삭제하는 것입니다.
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;
}
}
<<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)
다른 종류의 작업을 수행하기 위해 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 클라이언트의 유효한 비밀 키
문제없이 잘 작동합니다.
감사