2017-11-10 4 views
3

매우 큰 버킷 (수십만 개의 개체)이 있습니다. 나는 경로를 가지고있다. (s3 : // myBucket/path1/path2)./path2는 또한 폴더 인 업로드를 가져옵니다.AWS CLI S3API 경로에 최신 폴더 찾기

s3://myBucket/path1/path2/v6.1.0 
s3://myBucket/path1/path2/v6.1.1 
s3://myBucket/path1/path2/v6.1.102 
s3://myBucket/path1/path2/v6.1.2 
s3://myBucket/path1/path2/v6.1.25 
s3://myBucket/path1/path2/v6.1.99 

S3는 (어떤 의미) 정렬 계정 버전 번호를 고려하지 않고 알파벳 순으로 목록의 마지막 업로드 마지막이되지 않습니다 : 같은 샘플을 볼 수 있습니다. 이 예제에서 .../v6.1.102가 가장 최신 버전입니다.

는 여기에 지금까지있어 무엇 :

aws s3api list-objects 
--bucket myBucket 
--query "sort_by(Contents[?contains(Key, \`path1/path2\`)],&LastModified)"´ 
--max-items 20000 

그래서 여기에서 문제가 최대-항목은 재귀 버킷에있는 모든 파일에서 알파벳 순으로 시작하는 것 같다. 20000은 내 파일로 이동하지만 많은 파일을 처리하는 것은 매우 느립니다. 이것은 여전히 ​​전체 버킷을 검색되지만 난 그냥 경로 2의 /로 범위를 좁힐 할 -

1 :

그래서 제 질문은 두 가지이다. 내가 할 수 있을까?

2 -이 목록에는 개체 만 표시되며 대신 경로 목록을 가져올 수 있습니까?

기본적으로 최종 목표는 위의 예제에서 'v6.1.102'와 같은 최신 폴더 이름을 반환하는 명령입니다.

+0

'head-object' 사용 – Asdfg

답변

4

# 1에 답하려면 # --prefix path1/path2을 추가하여 버킷에서 검색어를 제한하십시오. 나는 단지 list_objects_v2head_object (boto3) 마지막 개체에 대한 수정하려면 프로그램 종류

업데이트

을 결합하는 SDK를 사용하여 생각할 수를 마지막으로 수정하여 정렬의 관점에서

또는 LastModified을 역순으로 정렬하고 jmespath을 반환하고 가장 최근의 객체를 제공하는 첫 번째 항목을 반환하고 거기에서 디렉토리를 수집 할 수 있습니다.

aws s3api list-objects-v2 \ 
--bucket myBucket \ 
--prefix path1/path2 \ 
--query 'reverse(sort_by(Contents,&LastModified))[0]' 
+0

고마워요! 접두사는 확실히 좁히기 위해 작동합니다. 반대의 경우 구문 오류가 발생합니다. 알 수없는 기능 : 역방향이지만 여기에서 알아낼 수 있습니다. –

+0

아마 'awscli'가 오래된 것일까 요? 나는 버전 1.11.183을 사용했다. 'pip install -U awscli' – tkwargs

+0

오, 저기 있습니다. 감사! –

2

예 : "최저 버전", "최고 버전", "모든 v6.x 버전"은 버전 번호가있는 별도의 데이터베이스를 유지 관리하는 것을 고려합니다.

가장 높은 버전 번호를 알아야하며 신속하게 검색해야하는 경우 (목록 개체 호출보다 빠름) 해당 버전 번호를 독립적으로 유지 관리 할 수 ​​있습니다. 예를 들어, path1/path2에 업로드되는 객체에 응답하는 람다 함수를 사용할 수 있습니다. 여기서 람다 함수는 s3 : //mybucket/version.max에서 파일로 본 가장 높은 버전 번호를 저장합니다.