Amazon S3 में फाइल्स और फोल्डर का नाम कैसे बदलें?


207

क्या अमेज़न S3 में फ़ाइलों और फ़ोल्डरों का नाम बदलने का कोई कार्य है? किसी भी संबंधित सुझाव का भी स्वागत है।

जवाबों:


62

S3 में किसी फ़ाइल का नाम बदलने का कोई सीधा तरीका नहीं है। आपको जो करना है, मौजूदा फ़ाइल को एक नए नाम (बस लक्ष्य कुंजी सेट करें) के साथ कॉपी करें और पुराने को हटा दें।


112
अपने उत्तर के साथ एक उदाहरण दें, अन्यथा टिप्पणी करें।
अनन्तौर

38
@EternHour अच्छा होगा .. लेकिन यह आवश्यक नहीं है .. सवाल भाषा के बारे में भी कोई संकेत नहीं है .. तो एक उदाहरण क्या करना है?
लिपिस डे

49
यह गलत उत्तर है। आप एमवी का उपयोग करके एस 3 पर फाइलें स्थानांतरित कर सकते हैं। mv = नाम बदलें
निकोलो

17
यह दो कारणों से एक गलत उत्तर है: 1) आप GUI का उपयोग राइट क्लिक और फ़ाइल का नाम बदलने के लिए कर सकते हैं, और 2) जैसा कि पहले उल्लेख किया गया है कि आप फ़ाइल को कमांड के साथ या sdk के माध्यम से स्थानांतरित कर सकते हैं।
मैक्सिमस

11
आप इसे S3 पर नाम बदलने के लिए एक फ़ोल्डर नाम पर राइट क्लिक नहीं कर सकते।
16:51 पर area51

458

मैंने अभी इसका परीक्षण किया है और यह काम करता है:

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

10
क्या यह परमाणु है? क्या दूसरा (और वही) कमांड विफल हो रहा है जबकि पहले निष्पादित हो रहा है?
एलेक्स बी

13
किसी भी एडब्ल्यूएस में परमाणु चालन प्रक्रिया नहीं है
एपी।

1
धन्यवाद! हमें आवश्यकता क्यों है --recursive?
अजीज अल्टो

2
@AzizAlto मामले में एक गहरी फ़ोल्डर संरचना है s3://<bucketname>/<folder_name_from>, यानी s3://<bucketname>/<folder_name_from>/some/deeper/folders
विले

1
@JohnEikenberry मैं विश्वास नहीं कर सकता कि राज की गलत टिप्पणी में 15 बदलाव हैं। इसे हटा देना चाहिए। संपादित करें: और इसे अभी हटा दिया गया था। अच्छा लगा।
डग एस

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 को प्राथमिकता देता हूं क्योंकि आप जांच सकते हैं कि कोई भी डिलीट करने से पहले कॉपी को सफलतापूर्वक बनाया गया है या नहीं।
थांग ट्रान

2
आप वास्तव में इसे चलाए बिना कमांड के आउटपुट की जांच करने के लिए -Dryrun ध्वज का उपयोग कर सकते हैं।
kmundnic


15

AWS S3 बाल्टी में फ़ाइलों और फ़ोल्डरों का नाम बदलने के लिए आप या तो AWS CLI या s3cmd कमांड का उपयोग कर सकते हैं।

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


पूरी तरह से नाम बदलने (नकल करने और फिर मूल फ़ोल्डर को हटाने के लिए विरोध के रूप में) की नकल करने के लिए, क्या आप स्रोत बनाने और उसी को लक्षित करने में सक्षम थे? या आपको उन्हें अलग करना था, तो मूल फ़ोल्डर को हटा दें?
18

मुझे लगता है कि मैंने एक कॉपी की थी तो मूल को हटा दें। स्मृति से मैंने अपने स्वयं के संदर्भ के लिए यह उत्तर लिखा था - स्वीकृत उत्तर वही कहता है, लेकिन कोड उदाहरण नहीं दिया। दूसरी ओर, मैं आपको एडब्ल्यूएस दस्तावेजों के माध्यम से नए सिरे से देखने की सलाह दूंगा, क्योंकि वे हर समय नए विकल्प विकसित कर रहे हैं।
टॉम

यह उदाहरण 'बस' 'चाल', (या 'नाम बदलें') के बजाय कॉपी कार्यक्षमता को दर्शाता है। मुझे पता है कि यह कुछ साल पुराना है, लेकिन कोई भी मौका जो आप इसे पूरी कार्यक्षमता के साथ अपडेट कर सकते हैं? ध्यान दें कि S3 नए टाइमस्टैम्प आदि (iirc) के साथ एक नई वस्तु के रूप में 'स्थानांतरित' ऑब्जेक्ट बनाएगा।
जेम्सबीबी

10

हमारे पास 2 तरीके हैं जिनके द्वारा हम AWS S3 संग्रहण पर एक फ़ाइल का नाम बदल सकते हैं -

1। सीएलआई उपकरण का उपयोग करना -

aws s3 --recursive mv s3: // बाल्टी-नाम / dirname / oldfile s3: // बाल्टी-नाम / dirname / newfile

2. एसडीके का उपयोग करना

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

8

GUI के माध्यम से एक फ़ोल्डर का नाम बदलने का कोई तरीका नहीं है, सबसे तेज़ (और अगर आपको GUI पसंद है) तो इसे प्राप्त करने का तरीका एक पुरानी पुरानी प्रतिलिपि का प्रदर्शन करना है। इसे प्राप्त करने के लिए: GU3 का उपयोग करके S3 पर नया फ़ोल्डर बनाएं, अपने पुराने फ़ोल्डर में जाएं, सभी का चयन करें, "कॉपी करें" और फिर नए फ़ोल्डर में नेविगेट करें और "पेस्ट" चुनें। जब हो जाए, तो पुराने फ़ोल्डर को हटा दें।

यह सरल विधि बहुत तेज़ है क्योंकि यह S3 से स्वयं की प्रतिलिपि है (पुन: अपलोड करने की आवश्यकता नहीं है या ऐसा कुछ भी नहीं है) और यह आपके द्वारा कॉपी की गई वस्तुओं की अनुमतियों और मेटाडेटा को भी बनाए रखता है।


@Trisped मेरे परीक्षण में अभी कुछ समय पहले, फ़ाइलों का नाम बदलकर वेब GUI का उपयोग किया जा सकता है, लेकिन फ़ोल्डर नहीं ।
रिनोगो

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
जरूरी नहीं कि एक ही फोल्डर में हो। आपके द्वारा प्रदान की गई कमांड एक आकर्षण की तरह काम करती है। धन्यवाद।
आर।

3

नीचे s3 पर फ़ाइल का नाम बदलने के लिए कोड उदाहरण है। स्पार्क ओ / पी फ़ाइल के कारण मेरी फ़ाइल पार्ट -000 * थी, फिर मैं इसे उसी स्थान पर किसी अन्य फ़ाइल नाम पर कॉपी करता हूं और पार्ट -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)

बस ध्यान दें कि यह अजगर का उपयोग कर रहा है
f.khantsis

2

AWS कंसोल में, यदि आप S3 पर जाते हैं, तो आप अपने फ़ोल्डरों को सूचीबद्ध देखेंगे। यदि आप फ़ोल्डर में नेविगेट करते हैं, तो आप ऑब्जेक्ट (ओं) को सूचीबद्ध देखेंगे। राइट क्लिक करें और आप नाम बदल सकते हैं। या, आप अपने ऑब्जेक्ट के सामने स्थित बॉक्स को चेक कर सकते हैं, फिर एक्शन नाम के पुल डाउन मेनू से, आप नाम बदल सकते हैं। बस मेरे लिए काम किया, 3-31-2019


"नाम बदलकर" मेरे लिए फ़ोल्डर्स के लिए तैयार हो गया है, और इंटरनेट ऐसे सवालों से भरा है जैसे "नाम बदलकर S3 ब्राउज़र में फ़ोल्डर्स के लिए क्यों बनाया गया है?"
स्टीव

1

जैसा कि नाज़ ने कहा कि एस 3 का सीधा नामकरण संभव नहीं है।

मैंने एक कोड स्निपेट संलग्न किया है जो सभी सामग्रियों को कॉपी करेगा

कोड काम कर रहा है बस अपने 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 (बकेटनेम, कीनेम) कहते हैं, तो यह अधिकतम 1000 आइटम पर लौटता है, आपको पता करने के लिए ObjectListing.isTununcated () विधि को कॉल करना चाहिए। यदि एक नया अनुरोध कॉल आवश्यक है। इस संदर्भ पर विचार करें docs.aws.amazon.com/AmazonS3/latest/dev/…
le0diaz

यह काम करता है लेकिन मैं ऊपर की टिप्पणी से भी सहमत हूं। बस सूची की जगह <S3ObjectSummary> fileList = s3client.listObjects (बकेटनेम, कीनेम) .getObjectSummaries (); ObjectListing ऑब्जेक्ट के साथ = s3.listObjects (बकेटनेम, कीनेम); सूची <S3ObjectSummary> fileList = new ArrayList <> (); fileList.addAll (objectListing.getObjectSummaries ()); जबकि (objectListing.isTruncated ()) {objectListing = s3.listNextBatchOfObjects (objectListing); fileList.addAll (objectListing.getObjectSummaries ()); }
कार्तिक

0

फ़ाइल और फ़ोल्डर वास्तव में S3 में ऑब्जेक्ट हैं। उनका नाम बदलने के लिए आपको PUT OBJECT COPY का उपयोग करना चाहिए। Http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPP.html देखें


1
जबकि कुछ भाषाओं में AWS द्वारा प्रस्तावित SDK नहीं है, बड़े लोग ( Python, Ruby, Java, C#, PHP, Node.js, Android, iOS, browser JavaScript) करते हैं और उन्हें aws.amazon.com/tools
डॉन चेडल

3
AWS से जावा 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

सभी * .csv.err फ़ाइलों को <<bucket>>/landingdir में * .csv फ़ाइलों के साथ 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

एक सॉफ्टवेयर है जहां आप विभिन्न प्रकार के ऑपरेशन करने के लिए s3 बाल्टी के साथ खेल सकते हैं।

सॉफ्टवेयर का नाम: S3 ब्राउज़र

S3 ब्राउज़र Amazon S3 और Amazon CloudFront के लिए एक फ्रीवेयर विंडोज क्लाइंट है। अमेज़ॅन 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 क्लाइंट के लिए आपकी मान्य स्क्रेच कुंजी

यह बिना किसी समस्या के ठीक काम कर रहा है।

धन्यवाद

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.