将目录结构完整复制到AWS S3存储桶


38

我想使用AWS S3 cli将完整目录结构复制到S3存储桶。

到目前为止,我尝试过的所有操作都将文件复制到存储桶中,但是目录结构已折叠。(换句话说,每个文件都复制到存储桶的根目录中)

我使用的命令是:

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

我还尝试过在源名称(例如,自变量的副本)后面加上斜杠。我还使用通配符来指定所有文件……我尝试做的每件事都只是将日志文件复制到存储桶的根目录中。


3
是! 绝对是答案。与Unix中不同,除非您要求cp命令(和sync命令)在目标端创建目标目录,否则它们不会在目标端创建目标目录。因此,如果您aws s3 cp --recursive mylocalsrcdir s3://bucket/将其简单地将文件放在本地存储库中的“根目录”存储桶中aws s3 cp --recursive mydirectory s3://bucket/mydirectory,则将在目标端重新创建目录结构。
agentv 2015年

Answers:


37

我相信同步是您想要的方法。尝试以下方法:

aws s3 sync ./logdata s3://bucketname/

4
...我对此感到很兴奋,但是它给了我与cp命令相同的结果。我的./logfiles目录中的文件已复制到存储桶中的根“目录”中。确实起作用的一件事是尝试此操作: aws s3 sync ./logdata s3://bucketname/logdata 谢谢带头。--- v
agentv 2015年

不幸的是,即使有了您的建议agentv,我也得到了相同的结果sync并没有保留目录结构,只是将所有内容弄平了。
niharvey

更新*-没关系,我的目录结构在
摘要中

9

在使用这两个命令时,我都遇到了错误。

$ 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

这不仅可以很好地完成工作,并且在控制台上显示出非常详细的输出,还可以部分上传大文件。


1
tl; dr:通配符文件对我来说在s3cmd中效果更好。就像aws-cli一样酷-对于我的一次性S3文件操作问题,它并没有像我希望的那样立即起作用-我最终安装并使用s3cmd。无论从语法上还是从概念上来讲,无论幕后工作如何,s3cmd都更加直观,更适合我对先入为主的看法。也许这不是您来这里的答案,但这对我有用。
BradChesney79 2011年

这很有用@ BradChesney79
agentv

最好描述一下您在sync命令上使用的选项。s3cmd也没有“ cp”命令吗?为什么使用sync而不是cp?
VinGarcia


2

使用以下脚本复制文件夹结构:

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

我无法获得s3 syncs3 cp无法在55 GB的文件夹中工作,其中包含数千个文件和超过2打的子目录。尝试同步整个文件夹只会导致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- 从找到的每个结果的开头删除“ ./”。


1

另外,您也可以尝试minio client aka mc

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

希望对您有所帮助。

PS:我是该项目的贡献者之一。


1
归功于应归功于的地方:mc完成了工作并保留了目录结构-太棒了!我已经很生气,无法安装> 200 MB的Python&Pip废话,使用awscli并在此处阅读,它折叠了dir结构
。.– joonas.fi 2016年

0

(改进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,...


这是惊人的。实际上,是手工的。
agentv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.