Utilice subcadenas de nombre de archivo como parámetros en el bucle for que crea el comando aws

Utilice subcadenas de nombre de archivo como parámetros en el bucle for que crea el comando aws

Estoy intentando cargar todos los archivos en un directorio en s3 usando fechas en los nombres de archivos como parámetros para crear las ubicaciones de s3. Esto es lo que tengo hasta ahora.

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

A continuación se muestra el resultado del archivo "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

quiero poner el archivo

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

Respuesta1

Dado un archivo "the_date=2017-05-04", su bucle for establecerá la filevariable en /home/ec2-user/clickparts/the_date=2017-05-04. Si tomas 4 caracteres del noveno carácter, obtienes -use, que es lo que ves cuando yearse usa tu variable.

Una forma de solucionar esto es tener en cuenta la cantidad de caracteres en su ruta y agregar la cantidad de caracteres (en este caso 26) a cada uno de los números iniciales al configurar las variables de año, mes y día.

Otra forma podría ser cambiar al directorio apropiado antes del bucle for (y volver a cambiar después de que finalice), luego su bucle for se convierte en for file in t*; do, lo que establecería su filevariable en lo que creo que está esperando.

Respuesta2

También puedes ejecutarlo a través del nombre base. filename="$(basename -- "$file")"

información relacionada