Estou tentando fazer upload de todos os arquivos de um diretório para o s3 usando datas nos nomes dos arquivos como parâmetros para criar os locais do s3. Aqui está o que tenho até agora.
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
Abaixo está a saída para o arquivo "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
quero colocar o arquivo
s3://mybucket/json/clicks/clickpartition/2017/05/04/the_date=2017-05-04
Responder1
Dado um arquivo "the_date=2017-05-04", seu loop for definirá a file
variável como /home/ec2-user/clickparts/the_date=2017-05-04
. Se você pegar 4 caracteres do 9º caractere, você obtém -use
, que é o que você vê onde sua year
variável é usada.
Uma maneira de corrigir isso é levar em conta o número de caracteres em seu caminho e adicionar o número de caracteres (neste caso 26) a cada um dos números iniciais ao definir suas variáveis ano, mês e dia.
Outra maneira pode ser mudar para o diretório apropriado antes do loop for (e voltar depois que ele terminar), então seu loop for se tornará for file in t*; do
, o que definiria sua file
variável para o que acredito que você está esperando.
Responder2
Você também pode executá-lo através do nome base
filename="$(basename -- "$file")"