このディレクトリ/data/files/
には、次のような数千のファイルがあります。
1test
2test
3test
[...]
60000test
60001test
AWS CLI
を使用して、S3バケット(AWS)にも送信しています。ただし、S3バケットがオフラインになることがあり、そのためファイルがスキップされることがあります。
/data/files/
に存在するファイルがS3バケットにもあるかどうかを確認するにはどうすればよいですか?ない場合は、不足しているファイルをS3にコピーしますか?
私はBASHを使用してこれを行うことを好みます。また、AWS CLIを別のAWS CLIに変更する必要がある場合は、変更できます。
@derobertが示唆したように、rclone
[1]を使用してそれを行うことができました。
コマンドは非常に簡単です:
rclone check sourcepath remote:s3bucketname
例:
S3バケット(バケット名:tmp_data_test_bucket
)には、このディレクトリにあるすべてのファイルがあります:/tmp/data/
コマンド:
rclone check /tmp/data/ remote:tmp_data_test_bucket
もし、するなら aws s3 ls
実際のファイル名。ファイル名が存在する場合、終了コードは0になり、ファイル名が表示されます。存在しない場合、終了コードは0になりません。
aws s3 ls s3://bucket/filname
if [[ $? -ne 0 ]]; then
echo "File does not exist"
fi
最初の答えは近いですが、Shebangで-eを使用する場合、スクリプトは失敗します。 wordcountを使用することをお勧めします。したがって、以下のコマンドを使用できます。
wordcount=`aws s3 ls s3://${S3_BUCKET_NAME}/${folder}/|grep $${file}|wc -c`
echo wordcount=${wordcount}
if [[ "${wordcount}" -eq 0 ]]; then
do something
else
do something
fi
以下を試してください:
aws s3api head-object --bucket ${S3_BUCKET} --key ${S3_KEY}
オブジェクト自体を取得せずに、オブジェクトのmetadataを取得します。 READ(s3:GetObject)アクセスが必要です。 。
例として2つの関数を作成しました。ファイルのサイズを知りたい場合と、ファイルが存在するかどうかを知りたい場合があるからです。
この関数は、ファイルのサイズを取得し、それをエコーとして「返します」。
s3_file_size() {
if command -v aws &> /dev/null; then
echo "$(aws s3 ls "${1}" --summarize | grep "Total.*Size" | grep -o -E '[0-9]+')"
return 0
else
echo "Warn-${FUNCNAME[0]}, AWS command missing."
return 1
fi
}
この関数は他の関数を使用して、ファイルサイズ0を受け取ったかどうかを判断します。これは、ファイルが本質的に存在しないことを意味します。 (はい、サイズ0のファイルは存在しないものとして扱います)
s3_does_file_exist() {
if command -v aws &> /dev/null; then
[[ $(s3_file_size "${1}") -lt 1 ]] && return 1 || return 0
else
echo "Warn-${FUNCNAME[0]}, AWS command missing."
return 1
fi
}