如何使用AWS CLI仅复制S3存储桶中与给定字符串模式匹配的文件

Sam*_*ert 10 r amazon-s3 amazon-web-services aws-cli

我正在使用AWS CLI使用如下命令将文件从S3存储桶复制到我的R计算机:

  system(
    "aws s3 cp s3://my_bucket_location/ ~/my_r_location/ --recursive --exclude '*' --include '*trans*' --region us-east-1"
    )
Run Code Online (Sandbox Code Playgroud)

这按预期工作,即它复制my_bucket_location中该位置文件名中包含"trans"的所有文件.

我面临的问题是我有其他文件具有类似的命名约定,我不想在此步骤中导入.作为一个例子,在下面的列表中我只想复制前两个文件,而不是最后两个:

File list
trans_120215.csv
trans_130215.csv
sum_trans_120215.csv
sum_trans_130215.csv
Run Code Online (Sandbox Code Playgroud)

如果我正在使用正则表达式,我可以使它更具体"^trans_\\d+",只需要引入前两个文件,但使用AWS CLI似乎不可能.所以我的问题是如何使用AWS CLI进行更复杂的模式匹配,如下所示?

  system(
    "aws s3 cp s3://my_bucket_location/ ~/my_r_location/ --recursive --exclude '*' --include '^trans_\\d+' --region us-east-1"
    )
Run Code Online (Sandbox Code Playgroud)

请注意,我只能使用有关文件的信息,即我想导入带有模式的文件"^trans_\\d+",我不能使用其他不需要的文件在开头包含sum_的事实,因为这只是一个例子可能是其他类似名称的文件,如"check_trans_120215.csv".

我已经考虑了下面的其他替代方案,但希望有一种方法可以调整复制命令以避免沿着这两条路线走下去:

  • 列出存储桶中的所有项目>使用R中的regex指定我想要的文件>仅导入这些文件
  • 保持复制命令的原样>复制后删除R机器上的不需要的文件

hel*_*loV 8

您列出的备选方案是最佳选择,因为S3 CLI不支持regex.

使用排除和包含过滤器:

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

*: Matches everything
?: Matches any single character
[sequence]: Matches any character in sequence
[!sequence]: Matches any character not in sequence
Run Code Online (Sandbox Code Playgroud)


小智 5

把这个放在这里供其他人找到,因为我只是想弄清楚这一点。这是我想出的:

s3cmd del $(s3cmd ls s3://[BUCKET]/ | grep '.*s3://[BUCKET]/[FILENAME]' | cut -c 41-)
Run Code Online (Sandbox Code Playgroud)

您可以将正则表达式放入 grep 搜索字符串中。例如,我正在搜索要删除的特定文件(因此是 s3cmd del)。我的正则表达式看起来像:'2016-11-04.*s3.*[DN][RS].*'。您可能需要根据您的使用情况调整切口。还应该与s3cmd get.