Use substrings de nome de arquivo como parâmetros no loop for que cria o comando aws

Use substrings de nome de arquivo como parâmetros no loop for que cria o comando aws

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 filevariá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 yearvariá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 filevariável para o que acredito que você está esperando.

Responder2

Você também pode executá-lo através do nome base filename="$(basename -- "$file")"

informação relacionada