如何在Amazon S3中重命名文件和文件夹?


207

Amazon S3中是否有任何功能可以重命名文件和文件夹?也欢迎任何相关建议。

Answers:


62

在S3中没有直接的方法来重命名文件。您需要做的是使用一个新名称复制现有文件(只需设置目标密钥)并删除旧文件。


112
提供答案示例,否则请发表评论。
EternalHour 2014年

38
@EternalHour会很好..但不是必须的。.这个问题甚至没有任何关于语言的提示..那么做一个例子有什么意义呢?
利皮斯,2015年

49
这是错误的答案。您可以使用mv在S3上移动文件。mv =重命名
Nicolo,2016年

17
这是一个错误的答案,原因有两个:1)您可以使用GUI右键单击并重命名文件,以及2)如前所述,您可以使用move命令或通过sdk移动文件。
Maximus

11
您无法右键单击文件夹名称以在S3上对其重命名。
16:51地区

458

我刚刚测试了它,它的工作原理是:

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

10
它是原子的吗?执行第一个命令时,第二个(和相同的)命令会失败吗?
Alex B

13
没有AWS没有原子移动操作
AP。

1
谢谢!我们为什么需要--recursive
阿齐兹·奥拓

2
@AzizAlto如果在下有更深的文件夹结构s3://<bucketname>/<folder_name_from>,即s3://<bucketname>/<folder_name_from>/some/deeper/folders
Ville

1
@JohnEikenberry我无法相信Raj的错误评论有15票赞成票。应该删除它。编辑:并且它刚刚被删除。真好
道格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

我刚刚完成了这项工作。您可以像这样使用适用于PHP的AWS开发工具包:

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)

此示例“仅”显示了复制功能,而不是“移动”(或“重命名”)。我知道它已经使用了几年了,但是您是否有机会使用完整的功能对其进行更新?请注意,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在我的测试刚才,文件可以使用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

3

以下是在s3上重命名文件的代码示例。由于存在火花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”的下拉菜单中选择“重命名”。刚刚为我工作,2019年3月31日


“ rename”对我来说是灰色的文件夹,并且互联网上充满了诸如“为什么在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)时,它最多返回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)却提供了SDK ,因此没有理由不使用它们aws.amazon.com/tools
Don Cheadle

3
AWS的Java SDK对于客户端应用程序来说太大(并且是整体的)。
杰西·巴纳姆

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

使用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存储桶一起玩,以执行各种操作。

软件名称:S3浏览器

S3浏览器是Amazon S3和Amazon CloudFront的免费Windows客户端。Amazon S3提供了一个简单的Web服务界面,可用于随时从Web上的任何位置存储和检索任意数量的数据。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客户端有效的密码密钥

它工作正常,没有任何问题。

谢谢

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.