Используйте подстроки имени файла в качестве параметров в цикле for, который создает команду aws

Используйте подстроки имени файла в качестве параметров в цикле for, который создает команду aws

Я пытаюсь загрузить все файлы в каталоге на 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. Если вы возьмете 4 символа из 9-го символа, вы получите -use, что вы и видите там, где yearиспользуется ваша переменная.

Один из способов исправить это — учесть количество символов в вашем пути и добавить это количество символов (в данном случае 26) к каждому начальному числу при настройке переменных года, месяца и дня.

Другой способ — перейти в соответствующий каталог перед циклом for (и вернуться обратно после его завершения), тогда ваш цикл for станет for file in t*; do, что установит вашу fileпеременную в то значение, которое, как я полагаю, вы ожидаете.

решение2

Вы также можете запустить его через basename filename="$(basename -- "$file")"

Связанный контент