개요
일반적으로 AWS CLI를 이용해 S3에 저장된 객체를 확인할 때는 리눅스의 ls 명령과 비슷하게 aws s3 ls 명령을 사용한다. 하지만 리눅스 ls 명령을 사용할 때처럼 와일드카드를 이용해 파일을 검색하려고 하면 아무것도 검색되지 않는다.
aws s3 ls s3://my-bucket/folder/*myfile*
와일드카드가 지원되지 않기 때문인데, 이를 대신할 수 있는 방법을 정리해둔다.
grep으로 필터링
가장 간단한 방법은 grep 명령을 이용해 출력을 필터링하는 방법이다.
aws s3 ls s3://my-bucket/folder/ | grep myfile
--include, --exclude 옵션으로 필터링
cp, mv, rm, sync와 같은 S3 명령에는 결과를 필터링할 수 있는 --include, --exclude 옵션을 지원하는데, 이를 이용해 특정 객체를 대상에서 제외하거나 포함시킬 수 있다.
지원하는 패턴 기호는 다음과 같다.
- * : 모든 값
- ? : 지정한 문자 하나와 일치하는 경우
- [str] : 괄호 내 연속된 문자열과 일치하는 경우
- [!str] : 괄호 내 연속된 문자열과 일치하지 않는 경우
또한, 옵션이 나열된 순서대로 우선순위가 정해지며, 먼저 나열된 조건이 우선순위가 낮다. 즉, 오름차순으로 나열하면 된다. 예로 들어 옵션이 아래와 같은 경우, 모든 객체를 대상에서 제외하지만 이름이 .txt로 끝나는 객체는 대상에 포함한다.
--exclude "*" --include "*.txt"
또한 그 명령이 실제로 수행되지 않도록 --dryrun 옵션을 사용하면 츨력만을 얻을 수 있다.
aws s3 sync s3://my-bucket . --exclude "*" --include "folder/*myfile*" --dryrun
sync 명령의 경우에는 지정한 prefix 하위 경로까지 전부 탐색하므로, 지정한 prefix에서만 탐색하고 싶다면 cp 명령을 사용하면 될 것 같다.
aws s3 cp s3://my-bucket . --exclude "*" --include "folder/*myfile*" --dryrun
--include, --exclude 옵션은 cp, mv, rm, sync 명령 모두 지원한다. 하지만 이 중에서 기존 소스를 변경하고 삭제하는 mv, rm 명령은 --dryrun을 실수로 누락하면 문제가 발생할 수 있으므로 cp, sync 명령 위주로 사용하는 게 더 안전할 것 같다.
참고 문서
https://docs.aws.amazon.com/cli/latest/reference/s3/
https://stackoverflow.com/questions/39857802/check-if-file-exists-in-s3-using-ls-and-wildcard