use*_*521 28 amazon-web-services aws-cli
aws s3 cp "dist/myfile" "s3://my-bucket/production/myfile"
Run Code Online (Sandbox Code Playgroud)
它总是复制myfile到s3 - 我想复制文件,如果它不存在,否则抛出错误.我怎么能这样做?或者至少我如何使用awscli检查文件是否存在?
Joh*_*ein 34
您可以通过列出文件来测试文件的存在,并查看它是否返回了某些内容.例如:
aws s3 ls s3://bucket/file.txt | wc -l
Run Code Online (Sandbox Code Playgroud)
如果文件不存在,这将返回零(无行).
如果您只想复制文件(如果该文件不存在),请尝试使用该sync命令,例如:
aws s3 sync . s3://bucket/ --exclude '*' --include 'file.txt'
Run Code Online (Sandbox Code Playgroud)
这将使本地文件与远程对象同步,只有在它不存在或本地文件与远程对象不同时才复制它.
kee*_*een 10
因此,事实证明"aws s3 sync"不执行文件,只执行目录.如果你给它一个文件,你会得到......有趣......行为,因为它会像你的目录那样对待任何东西,并在其上抛出一个斜杠.至少aws-cli/1.6.7 Python/2.7.5 Darwin/13.4.0可以.
%% date > test.txt
%% aws s3 sync test.txt s3://bucket/test.txt
warning: Skipping file /Users/draistrick/aws/test.txt/. File does not exist.
Run Code Online (Sandbox Code Playgroud)
所以,如果你 - 实际上 - 只想同步一个文件(只有上传,如果存在,如果校验和匹配),你可以这样做:
file="test.txt"
aws s3 sync --exclude '*' --include "$file" "$(dirname $file)" "s3://bucket/"
Run Code Online (Sandbox Code Playgroud)
请注意排除/包含顺序 - 如果您反过来,它将不包含任何内容.你的源和包含路径需要在匹配时保持健全,所以也许$(basename $ file)是 - 如果你正在使用完整路径,请包括... aws --debug s3 sync是你的朋友在这里看看包含如何评估.
并且不要忘记目标是目录密钥,而不是文件密钥.
这是一个有效的例子:
%% file="test.txt"
%% date >> $file
%% aws s3 sync --exclude '*' --include "$file" "$(dirname $file)" "s3://bucket/"
upload: ./test.txt to s3://bucket/test.txt/test.txt
%% aws s3 sync --exclude '*' --include "$file" "$(dirname $file)" "s3://bucket/"
%% date >> $file
%% aws s3 sync --exclude '*' --include "$file" "$(dirname $file)" "s3://bucket/"
upload: ./test.txt to s3://bucket/test.txt/test.txt
Run Code Online (Sandbox Code Playgroud)
(现在,如果只有一种方法可以让aws s3 -just-验证校验和,因为它似乎总是做多部分样式校验和..哦,也许一些--dryrun和一些输出抓取和同步..)
当且仅当列表成功时,您可以通过列出和复制来做到这一点。
aws s3 ls "s3://my-bucket/production/myfile" || aws s3 cp "dist/myfile" "s3://my-bucket/production/myfile"
Run Code Online (Sandbox Code Playgroud)
编辑:替换 && 到 || 具有如果列表失败的预期效果执行复制
| 归档时间: |
|
| 查看次数: |
26991 次 |
| 最近记录: |