Я пытаюсь загрузить все файлы в каталоге на 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")"