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

Bha*_*esh 3 amazon-s3 amazon-web-services aws-cli

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

但是我在使用不同的正则表达式时遇到了错误。

aws s3 cp s3://my-bucket-name/RAW_TIMESTAMP_0506* . --profile prod
Run Code Online (Sandbox Code Playgroud)

错误:

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

小智 10

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

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

  • 将 --exclude "*" 与上面的命令一起使用它应该可以工作。 (4认同)

Eys*_*ika 7

aws s3 cp s3://my-bucket/ <local directory path> --recursive --exclude "*" --include "<prefix>*"
Run Code Online (Sandbox Code Playgroud)

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


mus*_*n3d 6

如果您不喜欢静音控制台,您可以aws ls通过管道传输awk并返回aws cp.

例子

# url must be the entire prefix that includes folders.
# Ex.: url='s3://my-bucket-name/folderA/folderB',
# not url='s3://my-bucket-name'
url='s3://my-bucket-name/folderA/folderB'
prefix='RAW_TIMESTAMP_0506'
aws s3 ls "$url/$prefix" | awk '{system("aws s3 cp '"$url"'/"$4 " .")}'
Run Code Online (Sandbox Code Playgroud)

解释

  • ls部分非常简单。我使用变量来简化和缩短命令。始终将 shell 变量括在双引号中以防止灾难。
  • awk {print $4}只会从输出中提取文件名ls(而不是 S3 密钥!这就是为什么 url 必须是包含文件夹的整个前缀。)
  • awk {system("echo " $4")}会做同样的事情,但它是通过调用另一个命令来完成的。注意:我没有使用子shell ,因为这会在开始之前$(...)运行整个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用双引号将该变量引起来,因为这是一个很好的做法。


Joh*_*ein 5

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

来自:使用排除和包含过滤器

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

因此,您将使用类似:

aws s3 cp s3://my-bucket-name/ . --include "RAW_TIMESTAMP_0506*"
Run Code Online (Sandbox Code Playgroud)

  • 该命令根本不起作用。还需要排除,因为“--include”本身并不排除。 (3认同)
  • 我认为没有 --recursive 标志就行不通。我的存储桶中有一个内部目录,我不想从那里复制文件。请建议 (2认同)
  • 正确!使用`--recursive`标志,所以使用`aws s3 sync`,其中包括子目录。 (2认同)