特定のバケットに特定のファイルがあるかどうかを確認できるかどうかを知りたいです。
これは私が見つけたものです:
s3cmdを使用してファイルがS3バケットにあるかどうかを確認する
それは私の問題を解決するはずですが、何らかの理由で、ファイルが存在している間、ファイルが存在しないことを返し続けます。このソリューションも少し古く、
doesObjectExist
メソッドを使用しません。
Amazon S3 Webサービスで使用できるすべてのメソッドの概要
これにより、このメソッドの使用方法の構文が得られますが、動作させるようには思えません。
メソッドのステータスを保存するためにブール変数を作成することを期待していますか?または関数は出力を直接与えるか、エラーをスローしますか?
これは、bashスクリプトで現在使用しているコードです。
existBool=doesObjectExist(${BucketName}, backup_${DomainName}_${CurrentDate}.Zip)
if $existBool ; then
echo 'No worries, the file exists.'
fi
完全なパスを指定する代わりに、ファイルの名前のみを使用してテストしました。しかし、私が取得しているエラーは構文エラーなので、おそらくそれを間違って使用しているだけでしょう。
誰かが私を助けて、私が間違っていることを教えてくれることを願っています。
!編集
doesObjectExist
の使用は最速でも簡単でもないので、これを行う別の方法を探しました。
前回、パフォーマンスの比較を見ましたgetObjectMetadata
は、オブジェクトが存在するかどうかを確認する最も速い方法でした。 head-object
メソッド、例:
aws s3api head-object --bucket www.codeengine.com --key index.html
返されるもの:
{
"AcceptRanges": "bytes",
"ContentType": "text/html; charset=utf-8",
"LastModified": "Sun, 08 Jan 2017 22:49:19 GMT",
"ContentLength": 38106,
"ContentEncoding": "gzip",
"ETag": "\"bda80810592763dcaa8627d44c2bf8bb\"",
"StorageClass": "REDUCED_REDUNDANCY",
"CacheControl": "no-cache, no-store",
"Metadata": {}
}
「aws s3 ls」は、答えが受け入れられたとしても、まったく機能しないことに注意してください。特定のオブジェクトキーではなく、プレフィックスで検索します。誰かがファイル名の末尾に「1」を追加してファイルの名前を変更したときに、これが難しい方法であることがわかりましたが、存在チェックはまだTrueを返します。
(これをコメントとして追加しようとしましたが、まだ十分な担当者がいません。)
1つの簡単な方法は、aws s3 ls
exists=$(aws s3 ls $path_to_file)
if [ -z "$exists" ]; then
echo "it does not exist"
else
echo "it exists"
fi
@DaveMapleと@MichaelGlennの回答に従って、私が使用している条件は次のとおりです。
aws s3api head-object --bucket <some_bucket> --key <some_key> || not_exist=true
if [ $not_exist ]; then
echo "it does not exist"
else
echo "it exists"
fi