web-dev-qa-db-ja.com

S3バケットにファイルが存在するかどうかを確認します

このディレクトリ/data/files/には、次のような数千のファイルがあります。

1test
2test
3test

[...]

60000test
60001test

AWS CLIを使用して、S3バケット(AWS)にも送信しています。ただし、S3バケットがオフラインになることがあり、そのためファイルがスキップされることがあります。

/data/files/に存在するファイルがS3バケットにもあるかどうかを確認するにはどうすればよいですか?ない場合は、不足しているファイルをS3にコピーしますか?

私はBASHを使用してこれを行うことを好みます。また、AWS CLIを別のAWS CLIに変更する必要がある場合は、変更できます。

8
Patrick B.

@derobertが示唆したように、rclone [1]を使用してそれを行うことができました。

コマンドは非常に簡単です:

rclone check sourcepath remote:s3bucketname

例:

S3バケット(バケット名:tmp_data_test_bucket)には、このディレクトリにあるすべてのファイルがあります:/tmp/data/

コマンド:

rclone check /tmp/data/ remote:tmp_data_test_bucket

[1] http://rclone.org/

0
Patrick B.

もし、するなら aws s3 ls実際のファイル名。ファイル名が存在する場合、終了コードは0になり、ファイル名が表示されます。存在しない場合、終了コードは0になりません。

aws s3 ls s3://bucket/filname
if [[ $? -ne 0 ]]; then
  echo "File does not exist"
fi
12
onetwopunch

最初の答えは近いですが、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
3
Anuj Agrawal

以下を試してください:

aws s3api head-object --bucket ${S3_BUCKET} --key ${S3_KEY}

オブジェクト自体を取得せずに、オブジェクトのmetadataを取得します。 READ(s3:GetObject)アクセスが必要です。 。

0
Subrata Das

例として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
}
0
Mike Q