如果cp文件只有在它不存在的情况下如何,否则抛出错误?

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)

这将使本地文件与远程对象同步,只有在它不存在或本地文件与远程对象不同时才复制它.

  • 同步不适用于文件,只适用于目录. (7认同)
  • `aws s3 ls s3://bucket/file.txt | wc -l`不准确 - 它将列出具有该前缀的文件,而不是确切的名称.请考虑以下事项:http://stackoverflow.com/a/17456170/391618 (5认同)

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和一些输出抓取和同步..)


avi*_*ano 6

当且仅当列表成功时,您可以通过列出和复制来做到这一点。

aws s3 ls "s3://my-bucket/production/myfile" || aws s3 cp "dist/myfile" "s3://my-bucket/production/myfile"
Run Code Online (Sandbox Code Playgroud)

编辑:替换 && 到 || 具有如果列表失败的预期效果执行复制