使用前缀将数据从s3复制到本地

时间:2017-06-16 07:41:29

标签: amazon-web-services amazon-s3 aws-cli

我正在尝试使用aws-cli将数据从s3复制到带有前缀的本地。

但我正在使用不同的正则表达式出错。

aws s3 cp s3://my-bucket-name/RAW_TIMESTAMP_0506* . --profile prod

错误:

  

找不到匹配项:s3:// my-bucket-name / RAW_TIMESTAMP_0506 *

4 个答案:

答案 0 :(得分:4)

aws s3 cp s3://my-bucket/ <local directory path> --recursive --exclude "*" --include "<prefix>*"

这将仅复制具有给定前缀的文件

答案 1 :(得分:3)

aws s3 cp命令不接受通配符作为文件名(键)的一部分。相反,您必须使用--include--exclude参数来定义文件名。

来自:Use of Exclude and Include Filters

  

目前,不支持在命令的路径参数中使用UNIX样式通配符。但是,大多数命令都具有--exclude "<value>"--include "<value>"参数,可以实现所需的结果。这些参数执行模式匹配以排除或包含特定文件或对象。支持以下模式符号。

所以,你会使用类似的东西:

aws s3 cp s3://my-bucket-name/ . --include "RAW_TIMESTAMP_0506*"

答案 2 :(得分:1)

以上答案无法正常工作...例如我按日期在目录中有数千个文件,我希望只检索所需的文件..所以我尝试了每个文件的正确版本:

aws s3 cp s3://mybucket/sub /my/local/ --recursive --exclude "*" --include "20170906*.png"

它没有下载前缀文件,但开始下载所有内容

然后我尝试了上面的示例:

aws s3 cp s3://mybucket/sub/ . /my/local --recursive --include "20170906*"

并且它还下载了所有内容......似乎这是aws cli的一个持续问题,他们无意修复它...这是我在谷歌搜索时发现的一些解决方法,但它们不太理想

https://github.com/aws/aws-cli/issues/1454

答案 3 :(得分:0)

如果您不喜欢静默控制台,则可以通过aws lsawk管道传输aws cp

示例

url='s3://my-bucket-name'
prefix='RAW_TIMESTAMP_0506'
aws s3 ls "$url/$prefix" | awk '{system("aws s3 cp '"$url"'/"$4 " .")}'

说明

  • ls部分非常简单。我正在使用变量来简化和缩短命令。始终将外壳程序变量用双引号引起来,以免造成灾难。
  • awk {print $4}将仅从ls输出中提取文件名
  • awk {system("echo " $4")}会做同样的事情,但是它通过调用另一个命令来实现。注意:我没有使用子外壳$(...),因为它将在开始ls | awk之前运行整个cp部分 。那会很慢,而且一会儿也不会打印任何东西。
  • awk '{system("echo aws s3 cp "$4 " .")}'将打印与我们想要的命令非常接近的命令。注意间距。如果尝试运行此命令,则会发现有些不正确。这将产生类似aws s3 cp RAW_TIMESTAMP_05060402_whatever.log .
  • 的命令 我们正在寻找
  • awk '{system("echo aws s3 cp '$url'/"$4 " .")}'。这会将路径添加到文件名。仔细看看报价。请记住,我们将awk参数用单引号引起来,所以如果要在该参数中使用shell变量,则必须关闭并重新打开引号。
  • awk '{system("aws s3 cp '"$url"'/"$4 " .")}'是最终版本。我们只需要删除echo来实际执行awk创建的命令。当然,我也将$url变量用双引号引起来,因为这是一种好习惯。