S3 버킷에 파일이 있는지 확인

S3 버킷에 파일이 있는지 확인

이 디렉터리에는 /data/files/다음과 같은 수천 개의 파일이 있습니다.

1test
2test
3test

[...]

60000test
60001test

.AWS CLI

/data/files/S3 버킷에 있는 파일이 S3 버킷에도 있는지 어떻게 확인할 수 있나요 ? 누락된 파일이 S3에 복사되지 않으면 어떻게 되나요?

나는 BASH를 사용하여 이 작업을 수행하는 것을 선호합니다. 또한 AWS CLI를 다른 CLI로 변경해야 하는 경우에도 괜찮습니다.

답변1

aws s3 ls실제 파일 이름으로 이 작업을 수행하는 경우 . 파일 이름이 있으면 종료 코드는 0이 되고 파일 이름은 표시됩니다. 그렇지 않으면 종료 코드는 0이 아닙니다.

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

답변2

첫 번째 대답은 비슷하지만 shebang에서 -e를 사용하면 스크립트가 실패하므로 마지막으로 원하는 것입니다. 단어 수를 사용하는 것이 가장 좋습니다. 따라서 다음 명령을 사용할 수 있습니다.

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

다음을 시도해 보세요:

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

그것은 검색한다메타데이터객체 자체를 검색하지 않고도 객체에 대한 정보를 얻을 수 있습니다.읽기(s3: 객체 가져오기)액세스가 필요합니다. .

답변4

파일의 크기를 알고 싶고, 파일이 존재하는지 알고 싶을 수도 있겠다는 생각에 예제로 두 가지 함수를 만들었습니다.

이 함수는 파일 크기를 가져와서 에코로 "반환"합니다.

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
}

관련 정보