aws 명령을 빌드하는 for 루프에서 파일 이름의 하위 문자열을 매개변수로 사용

aws 명령을 빌드하는 for 루프에서 파일 이름의 하위 문자열을 매개변수로 사용

s3 위치를 생성하기 위해 파일 이름의 날짜를 매개변수로 사용하여 디렉터리의 모든 파일을 s3에 업로드하려고 합니다. 지금까지 내가 가진 것은 다음과 같습니다.

for file in /home/ec2-user/clickparts/t*; do 
    year="${file:9:4}"
    month="${file:14:2}"
    day="${file:17:2}"
    aws s3 cp "$file" s3://mybucket/json/clicks/clickpartition/$year/$month/$day/
done

다음은 "the_date=2017-05-04" 파일의 출력입니다.

upload: ./the_date=2017-05-04 to s3://mybucket/json/clicks/clickpartition/-use//c/ic//the_date=2017-05-04

파일을 넣고 싶어요

s3://mybucket/json/clicks/clickpartition/2017/05/04/the_date=2017-05-04

답변1

파일 "the_date=2017-05-04"가 주어지면 for 루프는 변수 file/home/ec2-user/clickparts/the_date=2017-05-04. 9번째 문자에서 4자를 취하면 변수가 사용되는 -use위치를 알 수 있는 이 표시 됩니다.year

이 문제를 해결하는 한 가지 방법은 경로의 문자 수를 고려하고 연도, 월 및 일 변수를 설정할 때 각 시작 번호에 문자 수(이 경우 26)를 추가하는 것입니다.

또 다른 방법은 for 루프 이전에 적절한 디렉토리로 변경하고(완료된 후에 다시 변경하는 것) for 루프가 되어 변수가 예상한 대로 for file in t*; do설정되는 것입니다 .file

답변2

basename을 통해 실행할 수도 있습니다. filename="$(basename -- "$file")"

관련 정보