AWS CLI S3同步:如何排除多个文件

Fil*_*org 1 bash amazon-s3 aws-cli

因此,我有一个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
Run Code Online (Sandbox Code Playgroud)

但是-正如您所看到的,我有很多文件要排除在外,并且此列表将来可能会增加。

所以我的问题是:有什么办法可以将要排除的文件放入数组,然后对其进行迭代?

也许像这样:

#!/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
Run Code Online (Sandbox Code Playgroud)

Gor*_*son 5

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

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

然后使用如下数组:

aws s3 sync ./ s3://bucketname --profile Administrator \
  "${arrayOfExcludedItems[@]/#/--exclude=}"
Run Code Online (Sandbox Code Playgroud)

工作原理:[@]告诉外壳程序获取数组的所有元素(将每个元素作为一个单独的词处理),该/#a/b部分告诉外壳程序a在每个元素的开头用替换b,但a为空,因此它实际上只是添加了“ --exclude =“至开头。哦,它周围的双引号告诉外壳程序不要扩展通配符或以其他方式弄乱结果。