【问题标题】:aws cli s3 sync: how to exclude multiple filesaws cli s3 sync:如何排除多个文件
【发布时间】:2019-03-11 10:42:52
【问题描述】:

所以我有一个 bash 脚本,它从 AWS S3 存储桶中删除所有内容,然后将本地文件夹的内容上传到同一个存储桶。

#!/bin/bash

# deploy to s3
function deploy(){
    aws s3 rm s3://bucketname --profile Administrator --recursive
    aws s3 sync ./ s3://bucketname --profile Administrator --exclude='node_modules/*' --exclude='.git/*' --exclude='clickCounter.py' --exclude='package-lock.json' --exclude='bundle.js.map' --exclude='package.json' --exclude='webpack_dev_server.js' --exclude='.vscode/*' --exclude='.DS_Store'
}

deploy

但是 - 如您所见,我有很多文件要排除在外,而且这个列表将来可能会增加。

所以我的问题是:有没有一种方法可以将要排除的文件放入一个数组中,然后对其进行迭代?

可能是这样的:

#!/bin/bash

arrayOfExcludedItems = (node_modules/* package-lock.json bundle.js.map )

# deploy to s3
function deploy(){
    aws s3 rm s3://bucketname --profile Administrator --recursive
    aws s3 sync ./ s3://bucketname --profile Administrator for item in arrayOfExcludedItems --exclude
}

deploy

【问题讨论】:

    标签: bash amazon-s3 aws-cli


    【解决方案1】:

    您不能在参数列表的中间使用循环,但您可以在每个元素的开头添加“--exclude=”进行文本替换。但是,首先,您必须正确声明数组;这意味着= 周围没有空格,并且您需要引用任何包含通配符的条目(您不想当场扩展):

    arrayOfExcludedItems=('node_modules/*' '.git/*' clickCounter.py package-lock.json \
      bundle.js.map package.json webpack_dev_server.js '.vscode/*' .DS_Store)
    

    然后像这样使用数组:

    aws s3 sync ./ s3://bucketname --profile Administrator \
      "${arrayOfExcludedItems[@]/#/--exclude=}"
    

    它是如何工作的:[@] 告诉 shell 获取数组的所有元素(将每个元素视为一个单独的单词),/#a/b 部分告诉它用 @ 替换每个元素开头的 a 987654327@,但a 是空的,所以它实际上只是在开头添加了“--exclude=”。哦,它周围的双引号告诉 shell 不要扩展通配符或以其他方式混淆结果。

    【讨论】:

    • 完美!正是我想要的!喜欢对代码如何工作的解释,谢谢一堆好先生
    • /#a/b 很酷。我不知道你可以用它来转换一个数组。
    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 2017-06-03
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    相关资源
    最近更新 更多