web-dev-qa-db-ja.com

ディレクトリ構造をそのままAWS S3バケットにコピーする

AWS S3 CLIを使用して、完全なディレクトリ構造をS3バケットにコピーしたいと思います。

これまでのところ、私が試したすべてのものはファイルをバケットにコピーしますが、ディレクトリ構造は折りたたまれています。 (言い換えれば、各ファイルはバケットのルートディレクトリにコピーされます)

私が使用するコマンドは:

aws s3 cp --recursive ./logdata/ s3://bucketname/

また、ソース指定(つまり、引数からのコピー)の末尾のスラッシュは省略してみました。また、すべてのファイルを指定するためにワイルドカードを使用しました...私が試みることはそれぞれ、ログファイルをバケットのルートディレクトリにコピーするだけです。

45
agentv

Shishir の解の改善)

  • 次のスクリプトをファイルに保存します(ファイルにはs3Copy.shという名前を付けました)
path=$1 # the path of the directory where the files and directories that need to be copied are located
s3Dir=$2 # the s3 bucket path

for entry in "$path"/*; do
    name=`echo $entry | sed 's/.*\///'`  # getting the name of the file or directory
    if [[ -d  $entry ]]; then  # if it is a directory
        aws s3 cp  --recursive "$name" "$s3Dir/$name/"
    else  # if it is a file
        aws s3 cp "$name" "$s3Dir/"
    fi
done
  • 次のように実行します。
    /PATH/TO/s3Copy.sh /PATH/TO/ROOT/DIR/OF/SOURCE/FILESandDIRS PATH/OF/S3/BUCKET
    たとえば、s3Copy.shがホームディレクトリに格納されていて、現在のディレクトリにあるすべてのファイルとディレクトリをコピーしたい場合は、次のように実行します。
    ~/s3Copy.sh . s3://XXX/myBucket

s3 cp--includeなどの--excludeの他の引数を許可するようにスクリプトを簡単に変更できます。

1
LoMaPh

同期はあなたが望む方法だと思います。代わりにこれを試してください:

aws s3 sync ./logdata s3://bucketname/
48
Chad Smith

これらのコマンドのいずれかを使用しているときに this エラーに直面していました。

$ aws s3 cp --recursive /local/dir s3://s3bucket/
OR
$ aws s3 sync /local/dir s3://s3bucket/

S3バケットをローカルにマウントしてからrsyncを実行することさえ考えました。何千ものファイルがあるため、失敗した(または数時間ハングした)場合でもです。

最後に、 s3cmd は魅力のように機能しました。

s3cmd sync /local/dir/ --delete-removed s3://s3bucket/ --exclude="some_file" --exclude="*directory*"  --progress --no-preserve

これはうまく機能し、コンソールにかなり詳細な出力を表示するだけでなく、大きなファイルを部分的にアップロードします。

10
vikas027

以下は私のために働きました:

aws s3 cp ~/this_directory s3://bucketname/this_directory --recursive

次に、AWSは「作成」しますthis_directoryとすべてのローカルコンテンツをコピーします。

6

s3 syncまたはs3 cpで、数千のファイルと2ダースを超えるサブディレクトリが含まれる55 GBのフォルダで作業することができませんでした。フォルダー全体を同期しようとすると、バケットに何もアップロードせずにawscliが警告なしに失敗するだけです。

すべてのサブディレクトリとその内容を最初に同期するためにこれを行うことになりました(フォルダー構造は保持されます):

Nice find . -mindepth 1 -maxdepth 1 -type d | cut -c 3- | while read line; do aws s3 sync $"$line" "s3://bucketname/$line"; done

次に、これを実行して、最上位の30,000ファイルを取得しました。

Nice find . -mindepth 1 -maxdepth 1 -type f | cut -c 3- | while read line; do aws s3 cp "$line" "s3://bucketname/";

サーバーの負荷を監視します(wを使用して負荷を表示するだけのヒント)。負荷が高すぎる場合はctrl-zを使用してコマンドを一時停止します。 (fgもう一度続行するには)。

これを同じ場所にいる人を助けるためにここに置く。

ノート:

-mindepth 1除外.

-maxdepth 1は、s3 syncがサブディレクトリのコンテンツを正常に処理するため、サブディレクトリのコンテンツがリストに表示されないようにします。

cut -c 3-は、findの各結果の先頭から「./」を削除します。

3
twhitney

フォルダ構造をコピーするには、次のスクリプトを使用します。

s3Folder="s3://xyz.abc.com/asdf";

for entry in "$asset_directory"*
do
    echo "Processing - $entry"
    if [[ -d  $entry ]]; then
        echo "directory"
        aws s3 cp  --recursive "./$entry" "$s3Folder/$entry/"
    else
        echo "file"
        aws s3 cp "./$entry" "$s3Folder/"
    fi
done
2
Shishir Arora

これは私にとってはうまくいきます。aws s3 sync mydir s3:// rahuls-bucket/mydir

1
brahul

あるいは、ミニオクライアントaka mc を試すこともできます

$ mc cp Desktop/test/test/test.txt s3/miniocloud/Desktop/test/test/

お役に立てば幸いです。

PS:私はプロジェクトへの貢献者の一人です。

1
koolhead17