AWS S3 CLIを使用して、完全なディレクトリ構造をS3バケットにコピーしたいと思います。
これまでのところ、私が試したすべてのものはファイルをバケットにコピーしますが、ディレクトリ構造は折りたたまれています。 (言い換えれば、各ファイルはバケットのルートディレクトリにコピーされます)
私が使用するコマンドは:
aws s3 cp --recursive ./logdata/ s3://bucketname/
また、ソース指定(つまり、引数からのコピー)の末尾のスラッシュは省略してみました。また、すべてのファイルを指定するためにワイルドカードを使用しました...私が試みることはそれぞれ、ログファイルをバケットのルートディレクトリにコピーするだけです。
( 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
の他の引数を許可するようにスクリプトを簡単に変更できます。
同期はあなたが望む方法だと思います。代わりにこれを試してください:
aws s3 sync ./logdata s3://bucketname/
これらのコマンドのいずれかを使用しているときに 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
これはうまく機能し、コンソールにかなり詳細な出力を表示するだけでなく、大きなファイルを部分的にアップロードします。
以下は私のために働きました:
aws s3 cp ~/this_directory s3://bucketname/this_directory --recursive
次に、AWSは「作成」しますthis_directory
とすべてのローカルコンテンツをコピーします。
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の各結果の先頭から「./」を削除します。
フォルダ構造をコピーするには、次のスクリプトを使用します。
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
これは私にとってはうまくいきます。aws s3 sync mydir s3:// rahuls-bucket/mydir
あるいは、ミニオクライアントaka mc を試すこともできます
$ mc cp Desktop/test/test/test.txt s3/miniocloud/Desktop/test/test/
お役に立てば幸いです。
PS:私はプロジェクトへの貢献者の一人です。