STUDY/AWS

[AWS] 모든 파일을 S3로 Copy하기 (--recursive, --exclude, --include 옵션 사용하기)

끄적이는 보송 2022. 8. 1. 20:09
반응형

여러 파일을 CLI 명령어로 S3에 한 번에 옮기려 했으나, 내 예상과는 달리 "*"(아스타리스크)가 먹히지 않아 당황스러웠었다 (ex. s3 cp <./path/*> <S3 URL>). S3 CLI 명령어에는 파일과 폴더를 재귀적으로 처리하는 옵션이 있으며, "--recursive", "--exclude", "--include" 옵션을 활용해 여러 객체에 명령어를 수행할 수 있다. 이참에 S3 CLI 명령어로 여러 객체에 수행할 수 있는 것을 정리해볼까 한다. 예를 한번 들어보면서 시작해 보겠다.

 

S3 버킷에 있는 모든 객체 로컬로 다운로드

aws s3 cp s3://<bucke_name>/ ./ --recursive

S3 버킷에 있는 모든 객체를 로컬 시스템의 현재 경로로 복사를 하겠다는 명령어다. 만약 해당 버킷에 폴더가 있다면, 복사 대상의 경로에도 동일하게 모든 것들이 폴더 구조를 유지하면서 다운로드된다.

참고로 S3에는 폴더라는 개념이 없다. S3의 모든 객체에는 객체 이름과 동일한 키가 있고 "/" 특수 문자를 구분 기호로 사용해 우리에게 폴더의 느낌을 주는 것뿐이다.

 

로컬에 있는 모든 파일을 S3로 업로드

aws s3 cp ./ s3://<bucke_name>/ --recursive

특별히 다를 것 없다. Source & Destination의 순서만 바뀌었을 뿐이다. 참고로 복사하려는 로컬 경로에 폴더가 존재하지만 안에 아무런 파일도 없다면, S3에는 그 폴더가 업로드되지 않는다.

 

S3 버킷의 특정 폴더의 모든 하위 객체 로컬로 다운로드

aws s3 cp s3://<bucke_name>/<folder>/ ./ --recursive

첫 번째 예시와 비슷하다. 위 명령어는 특정 경로의 모든 하위 객체를 다운로드하겠다는 명령어다. 만약 로컬에서 S3로 다운로드하고 싶다면, 이것 역시 반대로 하면 된다.

 

조건을 걸어 특정 객체(파일)만 Copy 하기

aws s3 cp <source> <destination> --recursive --exclude="*" --include="*.jpg"

조건을 걸어 내가 원하는 객체(파일)만 명령어를 수행할 수 있도록 할 수 있다. 이런 경우, "-- exclude"와 "--include" 옵션을 활용할 수 있다. 위의 예시는 확장자가 jpg인 파일만 모두 copy 하겠다는 명령어다. 

여기서 주의해야 할 점은 "--exclude"와 "--include"의 위치가 바뀌면 전혀 다른 명령어가 된다. 두 옵션의 위치는 의미가 있다. 위 에시는 "모든 파일을 제외할 거지만 jpg 파일은 포함해 copy 하겠다"는 명령어다. 만약 둘의 위치가 바뀌면 "jpb 파일은 copy 하겠지만 모두 제외하겠다"가 되어 명령어는 의미가 없어진다.

 

--exclude (제외 옵션)

Local directory contains 3 files:
MyFile1.txt
MyFile2.rtf
MyFile88.txt

// Exclude all .txt files, resulting in only MyFile2.rtf being copied
$ aws s3 cp . s3://my-bucket/path --exclude "*.txt"

// Exclude all .txt files but include all files with the "MyFile*.txt" format, resulting in, MyFile1.txt, MyFile2.rtf, MyFile88.txt being copied
$ aws s3 cp . s3://my-bucket/path --exclude "*.txt" --include "MyFile*.txt"

// Exclude all .txt files, but include all files with the "MyFile*.txt" format, but exclude all files with the "MyFile?.txt" format resulting in, MyFile2.rtf and MyFile88.txt being copied
$ aws s3 cp . s3://my-bucket/path --exclude "*.txt" --include "MyFile*.txt" --exclude "MyFile?.txt"

 

 

--include (포함 옵션)

Local directory contains 3 files:
MyFile1.txt
MyFile2.rtf
MyFile88.txt

// Include all .txt files, resulting in MyFile1.txt and MyFile88.txt being copied
$ aws s3 cp . s3://my-bucket/path --include "*.txt"

// Include all .txt files but exclude all files with the "MyFile*.txt" format, resulting in no files being copied
$ aws s3 cp . s3://my-bucket/path --include "*.txt" --exclude "MyFile*.txt"

// Include all .txt files, but exclude all files with the "MyFile*.txt" format, but include all files with the "MyFile?.txt" format resulting in MyFile1.txt being copied

$ aws s3 cp . s3://my-bucket/path --include "*.txt" --exclude "MyFile*.txt" --include "MyFile?.txt"

 

 

사실 로컬에 있는 26463개의 파일을 s3로 옮길 일이 있어, 공부하게 됐다. 실제로 옮기고 테스트해보니 잘 옮겨진 게 확인된다. 콘솔 환경상에는 객체 수가 '999+' 로만 보이고 모니터링 지표값도 시간이 걸려 cli command를 이용해봤다. 

PowerShell 에서 확인
CMD 에서 확인

 

 

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-services-s3-commands.html

 

AWS CLI에서 상위 수준(s3) 명령 사용 - AWS Command Line Interface

PowerShell을 사용하는 경우 셸은 CRLF의 인코딩을 변경하거나, 파이프 입력이나 출력 또는 리디렉션된 출력에 CRLF를 추가할 수 있습니다.

docs.aws.amazon.com

https://docs.aws.amazon.com/cli/latest/reference/s3/cp.html

 

cp — AWS CLI 1.25.47 Command Reference

Note: You are viewing the documentation for an older major version of the AWS CLI (version 1). AWS CLI version 2, the latest major version of AWS CLI, is now stable and recommended for general use. To view this page for the AWS CLI version 2, click here. F

docs.aws.amazon.com

반응형