ChatGPT解决这个技术问题 Extra ChatGPT

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

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


b
bennythejudge

我刚刚对此进行了测试,并且可以正常工作:

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

是原子的吗?在第一个执行时,第二个(和相同的)命令会失败吗?
没有 AWS 没有原子移动操作
谢谢!为什么我们需要 --recursive
@AzizAlto 如果在 s3://<bucketname>/<folder_name_from> 下有更深的文件夹结构,即 s3://<bucketname>/<folder_name_from>/some/deeper/folders
值得一提的是,运行这个命令应该是免费的。 >> “在 S3 存储桶之间或从 Amazon S3 到同一 AWS 区域内的任何服务的传输都是免费的。”来源:Amazon S3 pricing - data transfer
M
Max

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


举例说明你的答案,否则发表评论。
这是错误的答案。您可以使用 mv 在 S3 上移动文件。 mv = 重命名
这是一个错误的答案,原因有两个:1)您可以使用 GUI 右键单击并重命名文件,以及 2)正如在使用 move 命令或通过 sdk 移动文件之前提到的那样。
您不能右键单击文件夹名称以在 S3 上重命名它。
aws s3 mv 命令,但它会出现在幕后,它会复制和删除而不是重命名对象。这个细节很重要,因为复制会导致每 GB 的成本,而简单的重命名则不会。
G
Glorfindel
aws s3 cp s3://source_folder/ s3://destination_folder/ --recursive
aws s3 rm s3://source_folder --recursive

cp 后跟 rm 是否比 mv 更可取?
我更喜欢 cp/rm 而不是 mv,因为您可以在进行任何删除之前检查副本是否已成功制作。
您可以使用 --dryrun 标志来检查命令的输出,而无需实际运行它。
C
Cavaz

您可以使用 AWS CLI commandsmv 文件


B
Basheer.O

您可以使用 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>

如果我需要重命名所有 .csv 文件怎么办。我怎么办?
T
Tom

我刚刚得到这个工作。您可以像这样使用适用于 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


为了完全模仿重命名(而不是复制然后必须删除原始文件夹),您是否能够使源和目标相同?或者您必须使它们不同,然后删除原始文件夹?
我想我做了一个副本,然后删除了原件。根据记忆,我写了这个答案供我自己参考 - 接受的答案是一样的,但没有给出代码示例。另一方面,我建议您重新审视一下 AWS 文档,因为它们一直在发展新的选项。
此示例“只是”显示了复制功能,而不是“移动”(或“重命名”)。我知道它已经有几年历史了,但是您有没有机会使用完整的功能对其进行更新?请注意,S3 会将“已移动”对象创建为具有新时间戳等 (iirc) 的新对象。
J
Jethro

这现在可以用于文件,选择文件,然后在 GUI 中选择操作 > 重命名。

要重命名文件夹,您必须创建一个新文件夹,然后选择旧文件夹的内容并将其复制/粘贴(再次在“操作”下)


请注意,您需要单击存储桶名称和子前缀(而不是单选按钮),以防您想在存储桶中选择带前缀的目标。
另请注意,这现在称为“操作”而不是“更多”。它们也可以通过上下文菜单获得。
对于可以从 S3 的 AWS 控制台完成的小型作业,这是最简单、最有效的答案。对于较大的工作,命令行甚至脚本是要走的路。
P
P_O_I_S_O_N

我们有两种方法可以重命名 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}",));

o
orcaman

无法通过 GUI 重命名文件夹,实现此目的的最快(如果您喜欢 GUI,也是最简单的)方法是执行普通的旧副本。为此:使用 GUI 在 S3 上创建新文件夹,进入旧文件夹,全选,标记“复制”,然后导航到新文件夹并选择“粘贴”。完成后,删除旧文件夹。

这个简单的方法非常快,因为它是从 S3 复制到自身(无需重新上传或类似的东西),并且它还像您期望的那样维护复制对象的权限和元数据。


@Trisped 在我刚才的测试中,可以使用 Web GUI 重命名文件,但不能重命名文件夹。
t
tuomastik

要重命名文件夹(从技术上讲,这是一组具有公共前缀作为键的对象),您可以使用带有 --recursive 选项的 aws CLI 移动命令。

aws s3 mv s3://bucket/old_folder s3://bucket/new_folder --recursive

最快最优雅的解决方案。
A
Alex from Jitbit

以下是在 .NET 中使用 S3 .NET SDK 的方法:

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

PS尽量使用客户端方法的“异步”版本,即使我没有这样做是为了可读性


A
Adiii

这适用于重命名同一文件夹中的文件

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

不一定在同一个文件夹中。您提供的命令就像一个魅力。谢谢你。
请注意:如果您需要复制整个目录,请包含 --recursive 选项
V
Vikas

下面是在 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
p
petertc

文件和文件夹实际上是 S3 中的对象。您应该使用 PUT OBJECT COPY 重命名它们。请参阅http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html


虽然某些语言没有 AWS 提供的 SDK,但大语言 (Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript) 有,而且没有理由不使用它们aws.amazon.com/tools
AWS 的 Java 开发工具包对于客户端应用程序来说太大(并且过于单一)。
Y
Yordan Georgiev

使用 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)

M
Mateen

正如 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;
}

}


请考虑编辑您的代码,因为此实现不会返回所有内容,正如您所暗示的那样,因为当您调用 listObjects(bucketName, keyName) 时,它最多返回 1000 个项目,您应该调用 ObjectListing.isTruncated() 方法来了解如果需要新的请求调用。将此作为参考docs.aws.amazon.com/AmazonS3/latest/dev/…
这行得通,但我也同意上面的评论。只需替换 List fileList = s3client.listObjects(bucketName, keyName).getObjectSummaries();使用 ObjectListing objectListing = s3.listObjects(bucketName, keyName); List fileList = new ArrayList<>(); fileList.addAll(objectListing.getObjectSummaries()); while (objectListing.isTruncated()) { objectListing = s3.listNextBatchOfObjects(objectListing); fileList.addAll(objectListing.getObjectSummaries()); }
b
brasofilo

在 AWS 控制台中,如果您导航到 S3,您将看到列出的文件夹。如果您导航到该文件夹,您将看到列出的对象。右键单击,您可以重命名。或者,您可以选中对象前面的框,然后从名为 ACTIONS 的下拉菜单中选择重命名。刚为我工作,2019 年 3 月 31 日


文件夹的“重命名”对我来说是灰色的,互联网上充满了诸如“为什么 S3 浏览器中的文件夹的重命名是灰色的?”之类的问题。
我也有同样的问题。我们要重命名的存储桶中有一个文件夹。但是当我选择文件夹时,“操作 > 重命名对象”显示为灰色。
G
German Schiavon Matteo

如果要重命名 s3 文件夹中的大量文件,可以运行以下脚本。

    FILES=$(aws s3api list-objects --bucket your_bucket --prefix 'your_path' --delimiter '/'  | jq -r '.Contents[] | select(.Size > 0) | .Key' | sed '<your_rename_here>')
     for i in $FILES
     do
      aws s3 mv s3://<your_bucket>/${i}.gz s3://<your_bucket>/${i}
     done   

D
Deepak Poojari

我所做的是创建一个新文件夹并将旧文件对象移动到新文件夹。


V
ViaTech

s3 中的文件夹结构存在很多“问题”,因为存储空间是平坦的。

我有一个 Django 项目,我需要能够重命名文件夹但仍保持目录结构完好无损,这意味着空文件夹也需要复制并存储在重命名的目录中。

aws cli 很好,但 cpsyncmv 都没有将空文件夹(即以“/”结尾的文件)复制到新文件夹位置,所以我混合使用了 boto3 和 {1 } 来完成任务。

或多或少我找到重命名目录中的所有文件夹,然后使用 boto3 将它们放在新位置,然后我用 aws cli cp 数据,最后将其删除。

import threading

import os
from django.conf import settings
from django.contrib import messages
from django.core.files.storage import default_storage
from django.shortcuts import redirect
from django.urls import reverse

def rename_folder(request, client_url):
    """
    :param request:
    :param client_url:
    :return:
    """
    current_property = request.session.get('property')
    if request.POST:
        # name the change
        new_name = request.POST['name']
        # old full path with www.[].com?
        old_path = request.POST['old_path']
        # remove the query string
        old_path = ''.join(old_path.split('?')[0])
        # remove the .com prefix item so we have the path in the storage
        old_path = ''.join(old_path.split('.com/')[-1])
        # remove empty values, this will happen at end due to these being folders
        old_path_list = [x for x in old_path.split('/') if x != '']

        # remove the last folder element with split()
        base_path = '/'.join(old_path_list[:-1])
        # # now build the new path
        new_path = base_path + f'/{new_name}/'
        # remove empty variables
        # print(old_path_list[:-1], old_path.split('/'), old_path, base_path, new_path)
        endpoint = settings.AWS_S3_ENDPOINT_URL
        # # recursively add the files
        copy_command = f"aws s3 --endpoint={endpoint} cp s3://{old_path} s3://{new_path} --recursive"
        remove_command = f"aws s3 --endpoint={endpoint} rm s3://{old_path} --recursive"
        
        # get_creds() is nothing special it simply returns the elements needed via boto3
        client, resource, bucket, resource_bucket = get_creds()
        path_viewing = f'{"/".join(old_path.split("/")[1:])}'
        directory_content = default_storage.listdir(path_viewing)

        # loop over folders and add them by default, aws cli does not copy empty ones
        # so this is used to accommodate
        folders, files = directory_content
        for folder in folders:
            new_key = new_path+folder+'/'
            # we must remove bucket name for this to work
            new_key = new_key.split(f"{bucket}/")[-1]
            # push this to new thread
            threading.Thread(target=put_object, args=(client, bucket, new_key,)).start()
            print(f'{new_key} added')

        # # run command, which will copy all data
        os.system(copy_command)
        print('Copy Done...')
        os.system(remove_command)
        print('Remove Done...')

        # print(bucket)
        print(f'Folder renamed.')
        messages.success(request, f'Folder Renamed to: {new_name}')

    return redirect(request.META.get('HTTP_REFERER', f"{reverse('home', args=[client_url])}"))


H
HansA

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;
    }
}

R
Radadiya Nikunj

有一个软件可以让您使用 s3 存储桶来执行不同类型的操作。

软件名称:S3浏览器

S3 Browser 是适用于 Amazon S3 和 Amazon CloudFront 的免费 Windows 客户端。 Amazon S3 提供了一个简单的 Web 服务接口,可用于随时随地从 Web 上的任何位置存储和检索任意数量的数据。 Amazon CloudFront 是一个内容分发网络 (CDN)。它可用于使用全球边缘位置网络来交付您的文件。

如果只是一次,那么您可以使用命令行来执行这些操作:

(1)重命名同一个bucket中的文件夹:

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 客户端的有效密钥

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

谢谢


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅