中野智文

中野智文(VOYAGE GROUP)のコンピュータなどのメモ

AWS CLI でフォルダ(ディレクトリ)の名前変更(mv)を行う方法

2014-06-12 14:05:26 | AWS

背景

と述べるほどでもないが、AWS CLIのmvのドキュメントにははっきりと書かれていない。(実は(7)が最も近い)

結論

ない。ただし、--recursive オプションで、ファイル単位でmvすることができる。例
aws s3 mv s3://mybucket/folder1  s3://mybucket/folder2 --recursive 
上記のコマンドを実行した場合、ファイル一つ一つをmvしてくれる。 mvも単なる名前の変更ではなく、内部でコピーするようで、ファイルのサイズに比例して時間がかかる。 ファイル(のサイズ)が膨大な場合、非常に時間がかかる。(例えば数時間から数日)

教訓

あとで変更しなくても良いようによく考えてファイル名をつけよう

追記

2014/06/12

もうちょっと上記のコマンドが何をやっているのか見てみたい。
awscli/customizations/s3/s3handler.py
には
    def _enqueue_multipart_tasks(self, filename):
        num_uploads = 1
        if filename.operation_name == 'upload':
            num_uploads = self._enqueue_multipart_upload_tasks(filename)
        elif filename.operation_name == 'move':
            if filename.src_type == 'local' and filename.dest_type == 's3':
                num_uploads = self._enqueue_multipart_upload_tasks(
                    filename, remove_local_file=True)
            elif filename.src_type == 's3' and filename.dest_type == 'local':
                num_uploads = self._enqueue_range_download_tasks(
                    filename, remove_remote_file=True)
            elif filename.src_type == 's3' and filename.dest_type == 's3':
                num_uploads = self._enqueue_multipart_copy_tasks(
                    filename, remove_remote_file=True)
            else:
                raise ValueError("Unknown transfer type of %s -> %s" %
                                 (filename.src_type, filename.dest_type))
        elif filename.operation_name == 'copy':
            num_uploads = self._enqueue_multipart_copy_tasks(
                filename, remove_remote_file=False)
        elif filename.operation_name == 'download':
            num_uploads = self._enqueue_range_download_tasks(filename)
        return num_uploads
とあり、_enqueue_multipart_copy_tasksをみると、
    def _enqueue_multipart_copy_tasks(self, filename,
                                      remove_remote_file=False):
        chunksize = find_chunksize(filename.size, self.chunksize)
        num_uploads = int(math.ceil(filename.size / float(chunksize)))
        upload_context = self._enqueue_upload_start_task(
            chunksize, num_uploads, filename)
        self._enqueue_upload_tasks(
            num_uploads, chunksize, upload_context, filename, tasks.CopyPartTask)
        self._enqueue_upload_end_task(filename, upload_context)
        if remove_remote_file:
            remove_task = tasks.RemoveRemoteObjectTask(
                filename=filename, context=upload_context)
            self.executor.submit(remove_task)
        return num_uploads
upload_taskとなっているようである。さらに調べたが、localシステムにdownloadしてs3にuploadしているわけではないようである。s3のput数やget数を消費するのか知りたかったが、わからなかった。

最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。