s3cmd: 複数のファイルをコピーしようとすると KeyError: 'dest_name' が発生します

s3cmd: 複数のファイルをコピーしようとすると KeyError: 'dest_name' が発生します

Hive を使用して S3 バケット内のいくつかのファイルを処理する必要があります。問題は、どうやら Hive がバケットをフォルダーとして使用することを好まないため、別のバケットにフォルダーを作成し、s3cmd 経由でそこにファイルをコピーすることにしました。

これが私の命令です:

s3cmd -v cp s3://main.bucket/\* s3://temp.bucket/input/

すると、s3cmd はすぐに転送するファイルが X 個あることを宣言し (通常は 5k++ 程度)、1 つのファイルをコピーした後、次のエラーを出して終了します。

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    An unexpected error has occurred.
  Please report the following lines to:
   [email protected]
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Problem: KeyError: 'dest_name'
S3cmd:   1.0.1

Traceback (most recent call last):
  File "/usr/local/bin/s3cmd", line 2006, in <module>
    main()
  File "/usr/local/bin/s3cmd", line 1950, in main
    cmd_func(args)
  File "/usr/local/bin/s3cmd", line 614, in cmd_cp
    subcmd_cp_mv(args, s3.object_copy, "copy", "File %(src)s copied to %(dst)s")
  File "/usr/local/bin/s3cmd", line 604, in subcmd_cp_mv
    dst_uri = S3Uri(item['dest_name'])
KeyError: 'dest_name'

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    An unexpected error has occurred.
    Please report the above lines to:
   [email protected]
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

まあ、それは最悪だ。

問題はバケット間の転送にあると考え、main.bucket 内にフォルダーを作成し、そこにすべてをコピーすることにしました。コピー先のフォルダーもコピーされてループなどが発生するかどうかは気にしませんでした。その時点で私は途方に暮れていました。

新しいコマンドは次のとおりです。

s3cmd -v cp s3://main.bucket/\* s3://main.bucket/111a/

再度、1 つのファイルのみがコピーされ、同じエラーが発生しました。

これはどういう意味でしょうか? どうすれば修正できますか?

ありがとう。

PS 他の方法がすべて失敗した場合は、AWS の GUI で実行できると思いますが、すべてのチェックボックスを手動でチェックするのは面倒です。私の知る限り、下にスクロールしすぎると、上でチェックしたファイルが忘れられてしまい、非常に遅いペースで実行せざるを得なくなります。

一度にすべて選択し、新しいディレクトリにコピーして貼り付ける方法があれば便利です。

答え1

非常に古いバージョンの s3cmd を使用しています。このバグはその後修正されたと思います。アップストリームの github.com/s3tools/s3cmd マスター ブランチでもう一度お試しください。現在、1.5.0-rc1 が最新のリリースです。

関連情報