amazon-web-services aws - अमेज़ॅन एस 3 में फ़ाइलों और फ़ोल्डर का नाम कैसे बदलें?





certification console (11)


आप फ़ाइलों को mv करने के लिए एडब्ल्यूएस सीएलआई कमांड का उपयोग कर सकते हैं

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




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

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



aws s3 cp s3://source_folder/ s3://destination_folder/ --recursive
aws s3 rm s3://source_folder --recursive



अब फाइलों के लिए यह संभव है, फ़ाइल का चयन करें और फिर चुनें> जीयूआई में नाम बदलें।

किसी फ़ोल्डर का नाम बदलने के लिए, आपको इसके बजाय एक नया फ़ोल्डर बनाना होगा, और पुराने की सामग्री का चयन करना होगा और इसे कॉपी / पेस्ट करना होगा (फिर से "अधिक" के अंतर्गत)




मुझे अभी यह काम मिल गया है। आप इस तरह PHP के लिए एडब्ल्यूएस एसडीके का उपयोग कर सकते हैं:

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




यहां बताया गया है कि आप इसे .NET में कैसे करते हैं, S3 .NET SDK का उपयोग करते हुए:

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

पीएस क्लाइंट विधियों के "Async" संस्करणों का उपयोग करने का प्रयास जहां संभव हो, भले ही मैंने पठनीयता के लिए ऐसा नहीं किया है




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



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

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




नाज़ द्वारा उत्तर दिया गया है कि एस 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;
}

}




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

S3cmd का उपयोग करके, किसी फ़ोल्डर का नाम बदलने के लिए निम्न वाक्यविन्यास का उपयोग करें,

s3cmd --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>

एडब्ल्यूएस सीएलआई का उपयोग करके, किसी फ़ोल्डर का नाम बदलने के लिए निम्न वाक्यविन्यास का उपयोग करें,

aws s3 --recursive mv s3://<s3_bucketname>/<old_foldername>/ s3://<s3_bucketname>/<new_folder_name>



जैसा कि हर किसी ने आपको बताया है, एडब्ल्यूएस एस 3 में कोई भी "फ़ोल्डर्स" नहीं है, आप उनके बारे में गलत तरीके से सोच रहे हैं। एडब्ल्यूएस एस 3 में "ऑब्जेक्ट्स" हैं, ये ऑब्जेक्ट फ़ोल्डर्स की तरह दिख सकते हैं लेकिन वे वास्तव में शब्द की पूरी समझ में फ़ोल्डर्स नहीं हैं। यदि आप अमेज़ॅन एडब्ल्यूएस एस 3 पर फ़ोल्डर्स बनाने की तलाश में हैं तो आपको बहुत अच्छे नतीजे नहीं मिलेगा।

इस अर्थ में "फ़ोल्डर्स" बनाने का एक तरीका है कि आप S3 पर एक अनुरूपित फ़ोल्डर संरचना बना सकते हैं, लेकिन फिर, अपने सिर को इस तथ्य के चारों ओर लपेटें कि आप एस 3 में ऑब्जेक्ट्स बना रहे हैं, फ़ोल्डर नहीं। इसके साथ-साथ, आपको इस अनुरूपित फ़ोल्डर संरचना को बनाने के लिए "put-object" कमांड की आवश्यकता होगी। अब, इस कमांड का उपयोग करने के लिए, आपको एडब्ल्यूएस सीएलआई उपकरण स्थापित करने की आवश्यकता है, उन्हें इंस्टॉल करने के लिए निर्देशों के लिए एडब्ल्यूएस सीएलआई स्थापना यहां जाएं।

आदेश यह है:

aws s3api put-object --bucket your-bucket-name --key path/to/file/yourfile.txt --body yourfile.txt

अब, इस आदेश के बारे में मजेदार हिस्सा यह है कि आपको इस आदेश को चलाने से पहले बनाए गए सभी "फ़ोल्डर" (ऑब्जेक्ट्स) की आवश्यकता नहीं है। इसका अर्थ यह है कि आपके पास चीजों को रखने के लिए "फ़ोल्डर" (ऑब्जेक्ट) हो सकता है, लेकिन फिर आप इस आदेश का उपयोग उस "फ़ोल्डर" (ऑब्जेक्ट) के भीतर नकली फ़ोल्डर संरचना बनाने के लिए कर सकते हैं जैसा कि मैंने पहले चर्चा की थी। उदाहरण के लिए, मेरे पास मेरे एस 3 बाल्टी के भीतर "आयातक" नामक "फ़ोल्डर" (ऑब्जेक्ट) है, मान लें कि मैं साल, महीने के "फ़ोल्डर" (ऑब्जेक्ट) संरचना के भीतर sample.txt को सम्मिलित करना चाहता हूं और फिर नमूना " फ़ोल्डर "(ऑब्जेक्ट) उस सब के भीतर।

अगर मेरे पास केवल मेरी बाल्टी के भीतर "आयातक" वस्तु है, तो मुझे इस आदेश को चलाने से पहले वर्ष, महीने और नमूना वस्तुओं ("फ़ोल्डर") बनाने के लिए पहले से ही जाने की आवश्यकता नहीं है। मैं इस आदेश को इस प्रकार चला सकता हूं:

aws s3api put-object --bucket my-bucket-here --key importer/2016/01/sample/sample.txt --body sample.txt

पुट-ऑब्जेक्ट कमांड तब जाएगा और उस पथ को बना देगा जिसे मैंने --key ध्वज में निर्दिष्ट किया है। यहां एक गहना है: भले ही आपके पास S3 पर अपलोड करने के लिए कोई फ़ाइल न हो, फिर भी आप S3 बाल्टी के भीतर ऑब्जेक्ट्स ("फ़ोल्डर्स") बना सकते हैं, उदाहरण के लिए, मैंने "फ़ोल्डर्स बनाने" के लिए एक शेल स्क्रिप्ट बनाई है बाल्टी के भीतर, - ध्वज को छोड़कर, और फ़ाइल नाम निर्दिष्ट नहीं करते हुए, और --key ध्वज में दिए गए पथ के अंत में एक स्लैश छोड़कर, सिस्टम एस 3 बाल्टी के भीतर वांछित अनुरूपित फ़ोल्डर संरचना बनाता है प्रक्रिया में एक फाइल डालने के बिना।

उम्मीद है कि यह आपको सिस्टम को थोड़ा बेहतर समझने में मदद करता है।

नोट: एक बार आपके पास "फ़ोल्डर" संरचना बनने के बाद, आप एस 3 के "सिंक" कमांड का उपयोग अपने स्थानीय मशीन पर किसी फ़ोल्डर के साथ वंश या "एसईसी" को सिंक्रनाइज़ करने के लिए कर सकते हैं, या यहां तक ​​कि किसी अन्य एस 3 बाल्टी के साथ भी।





amazon-web-services amazon-s3 amazon