我正在使用AWS CLI使用如下命令将文件从S3存储桶复制到我的R计算机:
system(
"aws s3 cp s3://my_bucket_location/ ~/my_r_location/ --recursive --exclude '*' --include '*trans*' --region us-east-1"
)
这可以按预期工作,即它复制my_bucket_location中该位置文件名中包含“trans”的所有文件。
我面临的问题是我有其他文件具有类似的命名约定,我不想在此步骤中导入。例如,在下面的列表中,我只想复制前两个文件,而不是最后两个文件:
File list
trans_120215.csv
trans_130215.csv
sum_trans_120215.csv
sum_trans_130215.csv
如果我正在使用正则表达式,我可以使它更具体,如"^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"
)
请注意,我只能使用有关该文件的信息,即我想导入模式"^trans_\\d+"
的文件,我不能使用其他不需要的文件在开头包含sum_的事实,因为这只是一个例子,可能有其他类似名称的文件,如“check_trans_120215.csv”。
我已经考虑了下面的其他替代方案,但希望有一种方法可以调整复制命令以避免沿着这两条路线走下去:
答案 0 :(得分:6)
您列出的替代方案是最佳选择,因为S3 CLI不支持regex
。
Use of Exclude and Include Filters:
目前,不支持使用UNIX样式通配符 命令的路径参数。但是,大多数命令都有--exclude ""和 - 包括""可以实现的参数 期望的结果。这些参数执行模式匹配 排除或包含特定文件或对象。以下模式 支持符号。
*: Matches everything
?: Matches any single character
[sequence]: Matches any character in sequence
[!sequence]: Matches any character not in sequence
答案 1 :(得分:2)
把这个放在这里让其他人找到,因为我只是想弄清楚这一点。这就是我想出的:
s3cmd del $(s3cmd ls s3://[BUCKET]/ | grep '.*s3://[BUCKET]/[FILENAME]' | cut -c 41-)
您可以将正则表达式放在grep搜索字符串中。例如,我正在搜索要删除的特定文件(因此s3cmd del)。我的正则表达式看起来像:'2016-11-04.*s3.*[DN][RS].*'
。您可能需要调整剪裁以供您使用。也应该使用s3cmd get
。
答案 2 :(得分:0)
删除方法相同,您可以将 rm 替换为 cp 您可以使用aws cli:https://aws.amazon.com/cli/和一些Unix命令来完成它。
此aws cli命令应该起作用:
aws s3 rm s3://<your_bucket_name> --exclude "*" --include "<your_regex>"
如果要包含子文件夹,则应添加标志-递归
或使用Unix命令:
aws s3 ls s3://<your_bucket_name>/ | awk '{print $4}' | xargs -I% <your_os_shell> -c 'aws s3 rm s3:// <your_bucket_name>/% $1'
说明: