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



所以我有一个 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

您不能在参数列表中间使用循环,但可以执行文本替换,在每个元素的开头添加"--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部分告诉它用b替换每个元素开头的a,但a是空的,所以它实际上只是在开头添加"--exclude="。哦,它周围的双引号告诉 shell 不要扩展通配符或以其他方式弄乱结果。

最新更新