我正在尝试使用aws-cli将数据从s3复制到带有前缀的本地。
但我正在使用不同的正则表达式出错。
aws s3 cp s3://my-bucket-name/RAW_TIMESTAMP_0506* . --profile prod
错误:
找不到匹配项:s3:// my-bucket-name / RAW_TIMESTAMP_0506 *
答案 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的一个持续问题,他们无意修复它...这是我在谷歌搜索时发现的一些解决方法,但它们不太理想
答案 3 :(得分:0)
如果您不喜欢静默控制台,则可以通过aws ls
到awk
管道传输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
变量用双引号引起来,因为这是一种好习惯。